Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Одно любое совпадение в двухтабличном запросе
 
 автор: Le bien   (04.09.2008 в 17:37)   письмо автору
 
 

Делаю поиск по форуму, столкнулся со следующей проблемой.

Допустим, юзер задает параметры поиска "Искать в названиях тем и в сообщениях", тоесть совпадение может быть с названием но не с сообщением, с сообщением НО не с названием, или же совпадение и тут и там =)
(простите что без дампа, смысл думаю и так понятен)
Запрос вида

SELECT `topics`.* FROM `topics`
LEFT JOIN (
SELECT `message` FROM `messages`
) AS `msg` ON `msg`.`message` LIKE '%запрос%'
WHERE `topic` LIKE '%запрос'

учитывает только совпадение и тут и там. Подскажите, как ограничится совпадением в любой таблице?

Попутно вопрос..

SELECT `topics`.`id` 
FROM `topics` 
LEFT JOIN (

SELECT `stext` , `topic` 
FROM `messages` 
) AS `slc` ON ( `slc`.`stext` = 'gg'  AND `slc`.`topic`=`topics`.`id`)

возвращает все 3 существующих `topic`, несмотря на то, что таблица messages вовсе пуста..

  Ответить  
 
 автор: Trianon   (04.09.2008 в 18:13)   письмо автору
 
   для: Le bien   (04.09.2008 в 17:37)
 

>Запрос вида
>
>SELECT `topics`.* FROM `topics`
>LEFT JOIN (
>SELECT `message` FROM `messages`
>) AS `msg` ON `msg`.`message` LIKE '%запрос%'
>WHERE `topic` LIKE '%запрос'
>
Зачем здесь внутренний селект?
Как соединяются таблицы?

>(простите что без дампа, смысл думаю и так понятен)
ну как?

  Ответить  
 
 автор: Le bien   (04.09.2008 в 18:20)   письмо автору
 
   для: Trianon   (04.09.2008 в 18:13)
 

Таблица topics:
id
name (название темы)

Таблица messages
id
topic (это id поля в таблице topics)
stext (cообщение)

Внутренний запрос нужен т.к. мы выводим темы в которых есть похожие сообщения

зы: ответ на второй вопрос не нужен, JOIN помог. Буду лишь признателен, если в двух словах сможете объяснить разницу между LEFT JOIN, RIGHT JOIN, JOIN.. Как я понимаю, LEFT возвращает результат селекта, RIGHT - результат подзапроса, JOIN лишь учитывает условие?

  Ответить  
 
 автор: Trianon   (04.09.2008 в 18:31)   письмо автору
 
   для: Le bien   (04.09.2008 в 18:20)
 

нет.
Разница проявляется тогда, когда условие соединения таблиц не выполняется.
попробуйте создать пару таблиц с непересекающимися ячейками и выполнить все три запроса. Разницу тут же увидите.

a.x  1  3 5
b.y   2 3  6
SELECT x,y FROM a JOIN b ON x = y
SELECT x,y FROM a LEFT JOIN b ON x = y
SELECT x,y FROM a RIGHT JOIN b ON x = y

  Ответить  
 
 автор: Le bien   (04.09.2008 в 18:47)   письмо автору
 
   для: Trianon   (04.09.2008 в 18:31)
 

Спасибо, разобрался.
Хотелось бы вернуться к теме. Можно ли как то добавить условие "ИЛИ" в запрос?

  Ответить  
 
 автор: Trianon   (04.09.2008 в 18:57)   письмо автору
 
   для: Le bien   (04.09.2008 в 18:47)
 

WHERE name LIKE '%запрос%' OR message LIKE '%запрос%'

  Ответить  
 
 автор: Le bien   (04.09.2008 в 19:07)   письмо автору
 
   для: Trianon   (04.09.2008 в 18:57)
 

0_o
меня самого поражает порой моя глупость..

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования