Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: помогите исправить SQL-запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
maxyer
Отправлено: 01 Февраля, 2012 - 11:39:23
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




Здравствуйте !
Нужна помощь.
Есть две таблицы

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE TABLE IF NOT EXISTS `today` (
  3.   `url` varchar(60) NOT NULL,
  4.   `html` text NOT NULL
  5.    PRIMARY KEY (`url`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  7.  
  8. CREATE TABLE IF NOT EXISTS `yesterday` (
  9.   `url` varchar(60) NOT NULL,
  10.   `html` text NOT NULL
  11.    PRIMARY KEY (`url`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  13.  


требуется
1. вывести url страниц, которые остались неизменными
2. вывести url страниц, которые изменились
3. вывести url страниц, которые исчезли
4. вывести url страниц, которые появились

пробовал следующий запрос
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT
  3. COALESCE(yesterday.url, today.url),
  4. CASE
  5.   WHEN yesterday.url IS NULL THEN 'Added'
  6.   WHEN today.url IS NULL THEN 'Removed'
  7.   ELSE 'Modified'
  8. END
  9. FROM today
  10. FULL JOIN yesterday ON yesterday.url = today.url
  11. WHERE yesterday.url IS NULL OR today.url IS NULL OR yesterday.html <> today.html
  12.  


получил следующую ошибку
1054: Unknown column 'today.url' in 'field list'

Ничего не понимаю.
Если убрать FULL, ошибка исчезает, но запрос работает, естественно, неверно.
Может поможет кто, в чем дело ?
 
 Top
Zuldek
Отправлено: 01 Февраля, 2012 - 13:20:35
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Читать про хранимые процедуры или не мудрить и решить задачу простыми SQL-запросами.
 
 Top
garvey
Отправлено: 01 Февраля, 2012 - 14:07:41
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


Помог: 3 раз(а)




Здесь нужен FULL OUTER JOIN. В MySQL он реализуется совместным использованием LEFT OUTER JOIN и RIGHT OUTER JOIN.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.     COALESCE(y.url, t.url),
  3.     CASE
  4.         WHEN y.url IS NULL THEN 'Added'
  5.         WHEN t.url IS NULL THEN 'Removed'
  6.         ELSE 'Modified'
  7.     END
  8. FROM today AS t
  9.     LEFT OUTER JOIN yesterday AS y
  10.         ON y.url = t.url
  11. WHERE y.url IS NULL
  12.     OR t.url IS NULL
  13.     OR y.html <> t.html
  14. UNION
  15. SELECT
  16.     COALESCE(y.url, t.url),
  17.     CASE
  18.         WHEN y.url IS NULL THEN 'Added'
  19.         WHEN t.url IS NULL THEN 'Removed'
  20.         ELSE 'Modified'
  21.     END
  22. FROM today AS t
  23.     RIGHT OUTER JOIN yesterday AS y
  24.         ON y.url = t.url
  25. WHERE y.url IS NULL
  26.     OR t.url IS NULL
  27.     OR y.html <> t.html

(Отредактировано автором: 01 Февраля, 2012 - 14:42:00)

 
 Top
maxyer
Отправлено: 01 Февраля, 2012 - 14:34:29
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




garvey пишет:
Здесь нужен FULL OUTER JOIN. В MySQL он реализуется совместным использованием LEFT

фигасе !
Работает.
Просто в википедии написано, что слово outer можно опускать.

Насколько я понимаю, ваш код эквивалентен моему ...
Плоховатенько только, что он в два раза длиннее.
Однако, все равно большое спасибо.
 
 Top
garvey
Отправлено: 01 Февраля, 2012 - 14:43:39
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


Помог: 3 раз(а)




maxyer, всегда пожалуйста. Есть один минус в этом запросе - UNION (лишняя трата ресурсов). Но другого пути сымитировать FULL OUTER JOIN в MySQL нет.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB