Помогите написать сложный запрос

rulin

Новичок
Помогите написать сложный запрос

Пишется система онлайн мониторинга за освобождающимися доменами, помогите написать sql запрос, а то я уже себе голову сломал

Есть две таблицы

PHP:
`domain`
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`) 
)

`yandex_toolbar`
(
  `id` int(11) NOT NULL auto_increment,
  `did` int(11) NOT NULL COMMENT 'domen id',
  `tcy` int(11) NOT NULL COMMENT 'Яндекс тИЦ',
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT 'Время Проверки',
  PRIMARY KEY  (`id`)
)


domain.id = yandex_toolbar.did

Выбрать 1 домен из таблицы domain

Если

1. Данный в таблице yandex_toolbar по домену отсутствуют
или
2. Последняя успешная (yandex_toolbar.tcy <> -1) проверка по домену проводилась >5 дней назад (yandex_toolbar.date)
или
3. Последняя проверка по домену была неудачной (yandex_toobar.tcy = -1) и последняя неудачная проверка проводилась больше часа назад (yandex_toolbar.date) и количество неудачных проверок за сутки небольше 3
 

rulin

Новичок
Автор оригинала: Mr_Max
Ошибки исправь, пожалуйста
грамматические? исправил

вот так:


PHP:
SELECT domain.id, domain.name FROM domain
        LEFT JOIN yandex_toolbar AS toolbar ON domain.id = toolbar.did 
        WHERE 
            (
                (   /* определяет сколько сегодня раз уже были повторные перепроверки из за ошибок */
                    SELECT count(toolbar.did) FROM yandex_toolbar AS toolbar 
                    WHERE
                            domain.id = toolbar.did
                            AND 
                            toolbar.date > FROM_UNIXTIME( '".(time()-UPDATE_PERIOD_TCY_TOOLBAR)."' )                  
                            AND toolbar.tcy < 0
                
                ) < 3
                AND
                (   /* определяет была ли повторная перепроверка из за ошибки за последнии N мин */
                    SELECT count(toolbar.did) FROM yandex_toolbar AS toolbar 
                    WHERE 
                            domain.id = toolbar.did 
                            AND  
                            toolbar.date > FROM_UNIXTIME('".(time()-(REPEAT_TIME_ERROR))."')
                            AND
                            toolbar.tcy < 0                    
                ) = 0
                AND                
                (
                    toolbar.tcy < 0 OR toolbar.tcy IS NULL                                    
                )
            ) LIMIT 1
 

FractalizeR

Новичок
А что не устраивает? Могу такой забавный вариант предложить:

[sql](SELECT name FROM domain D1 WHERE id NOT IN (SELECT DISTINCT did FROM yandex_toolbar YT1) LIMIT 1)

UNION

(SELECT name FROM domain D2 WHERE id=(SELECT did FROM yandex_toolbar YT2 WHERE (YT2.tcy <> -1) AND (YT2.date < DATE_SUB(NOW(), INTERVAL 5 DAY)) LIMIT 1))

UNION (
SELECT name FROM domain D3 WHERE id=(SELECT did FROM (
SELECT did, COUNT(did) AS num FROM yandex_toolbar YT3 WHERE YT3.tcy = -1 AND YT3.date < DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY did HAVING num<3 LIMIT 1) B1))[/sql]

Мне только кажется, что этот запрос лучше на три разбить, упорядочить по степени вероятности и выполнять соответственно, если предыдущий не дал результатов
 

chira

Новичок
rulin
Код:
SELECT d.name
FROM domain d
LEFT JOIN yandex_toolbar y ON d.id=y.did
  AND ( (y.tcy <> -1 AND y.date < DATE_SUB( NOW( ) , INTERVAL 5 DAY ))
    OR (y.tcy = - 1 AND y.date < DATE_SUB( NOW( ) , INTERVAL 1 HOUR ))
  )
WHERE y.id IS NULL
 
Сверху