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 :: Поиск по двум таблицам

 PHP.SU

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


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

> Без описания
VestCoastman
Отправлено: 06 Сентября, 2013 - 03:37:51
Post Id



Посетитель


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


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




Застрял на поиске.
Есть две таблицы - topics и posts
Таблица posts "привязана" по полю tid к таблице topics(используется для JOIN-ов)

Поиск идет по полям desc(это поле есть в таблицах topics и posts) и по полю title(оно есть только в таблице topics)

Соответственно делаю запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `t`.id AS tid, t.`desc`, `t`.title, `p`.id AS pid
  2. FROM topics AS `t`
  3. INNER JOIN posts AS `p`
  4. WHERE `t`.`desc` LIKE '%$key%'
  5. OR `t`.title LIKE '%$key%'
  6. OR `p`.`desc` LIKE '%$key%'


В результате такого запроса, я получаю все темы, куда попадает $key и все посты из этих тем, независимо от их содержимого. Но результатом должны быть только темы.
Подскажите, куда копать?
 
 Top
imya
Отправлено: 06 Сентября, 2013 - 08:56:44
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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




Может я что-то недопонял, но где вы связываете таблицы topics && posts ??


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
VestCoastman
Отправлено: 06 Сентября, 2013 - 12:47:11
Post Id



Посетитель


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


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




imya пишет:
Может я что-то недопонял, но где вы связываете таблицы topics && posts ??
В конкретном примере нигде. Они привязаны в выводе уже на самих страницах с темами и постами так
CODE (SQL):
скопировать код в буфер обмена
  1. ON t.id = p.tid
  2. # где t и p - topics и posts соответственно(как в примере выше)
 
 Top
EuGen Администратор
Отправлено: 06 Сентября, 2013 - 13:30:18
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Это происходит из-за приоритета опериций сравнений (по сути, в WHERE попадает независимый условия OR). В этом случае лучше воспользоваться полным (корректным с точки зрения SQL) синтаксисом JOIN:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT
  2.   `t`.id AS tid, t.`desc`, `t`.title, `p`.id AS pid
  3. FROM topics AS `t`
  4.   LEFT JOIN posts AS `p` ON t.id = p.tid
  5. WHERE
  6.   `t`.`desc` LIKE '%$key%'
  7.   OR `t`.title LIKE '%$key%'
  8.   OR `p`.`desc` LIKE '%$key%'


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 06 Сентября, 2013 - 13:41:04
Post Id



Посетитель


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


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




EuGen это чуть-чуть не то.
В этом случае, поиск будет производиться только по таблице topics, если искать пост с заведомо существующим ключевым словом в desc, то выдаст пустой результат.
 
 Top
EuGen Администратор
Отправлено: 06 Сентября, 2013 - 13:44:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




VestCoastman
Будет выдана та тема, которой принадлежит сообщение (по условию в WHERE - Вы же соединяете их через OR)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 06 Сентября, 2013 - 13:47:41
Post Id



Посетитель


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


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




EuGen, да, прошу прощения. Результатом будет (если искать ключевое слово из таблицы posts) - тема. А если искать по таблице topics, то результатом по прежнему будут все посты из темы.
Это происходит из-за `p`.id AS pid(проверил). В результате того, что в таблице topics просто нет поля pid, запросы видирает все из таблицы posts с данным tid.
Мне же нужно получить, либо идентификатор поста(ов)(p.id) и темы(tid), либо только темы(t.id)
(Добавление)
Просто не хочется делать, что-то на подобии "Расширенного поиска" с поиском только по таблице posts или по таблице topics

Я уже изначально накосячил, сделав две отдельные таблицы с постами и темами, хотя правильней было-бы все хранить только как посты

(Отредактировано автором: 06 Сентября, 2013 - 14:01:48)

 
 Top
EuGen Администратор
Отправлено: 06 Сентября, 2013 - 15:30:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Вам нужно определиться с тем, что Вы хотите выбрать (поля в SELECT), по каким условиям (части WHERE) и из каких таблиц (условия в JOIN)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 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