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
Форумы портала PHP.SU :: Версия для печати :: Составной запрос из БД
Форумы портала PHP.SU » PHP » Программирование на PHP » Составной запрос из БД

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

1. isle - 24 Июня, 2010 - 10:01:32 - перейти к сообщению
Всем привет. Пробую освоить сложные запросы в БД, но никак пока не выходит. Столкнулся с такой задачей: имею id поста, нужно узнать его id категории и из этой категории вытащить остальные посты. Модуль аля "похожие посты". Из простых нескольких запросов сделал - работает, но как несколько запросов объединить для выборки - не пойму, хотя много примеров перекопал и перепробовал разные варианты, может, кто знает?

CODE (htmlphp):
скопировать код в буфер обмена
  1.   $sql = "
  2.         SELECT id, category, autor, date, short_story, title, descr, alt_name
  3.         FROM dle_post p
  4.         WHERE p.category='$category' && p.approve='1' && p.short_story!='' && p.title!=''
  5.         GROUP BY p.id
  6.         ORDER BY p.id ASC
  7.         LIMIT 0,10";
  8.   $res = $db->query($sql);
  9.   while($r = $db->get_row($res)) echo $r['id'].'/';


Если вместо p.category='$category' вписать конкретную категорию, то работает, иначе - никак.
2. SAD - 24 Июня, 2010 - 10:15:55 - перейти к сообщению
А это за ересь - && ? Надо использовать AND, вместо &&
3. isle - 24 Июня, 2010 - 10:27:30 - перейти к сообщению
SAD пишет:
А это за ересь - && ? Надо использовать AND, вместо &&


Какая разница? - работает же! Есть что по делу сказать?
4. duk - 24 Июня, 2010 - 11:08:50 - перейти к сообщению
что-нибудь типа

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT id, category, autor, date, short_story, title, descr, alt_name
  3.        FROM dle_post p
  4.        WHERE p.category in (select category from dle_post where id='$currentid') && p.approve='1' && p.short_story!='' && p.title!=''
  5.        GROUP BY p.id
  6.        ORDER BY p.id ASC
  7.        LIMIT 0,10"
  8.  
5. isle - 24 Июня, 2010 - 11:26:35 - перейти к сообщению
duk, спасибо, здорово, так работает. Сейчас нашел в сети интересные картинки запросов:

_http://codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlhttp://forum.php.su/topic.php?forum=1&topic=4267

и группировки:

_http://sql-ex.ru/help/select4.php

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

Теперь такой вопрос возник: на сколько приведенный пример оптимизирован? - нужно для сайта с большой посещалкой.
6. duk - 24 Июня, 2010 - 12:15:04 - перейти к сообщению
isle пишет:

Теперь такой вопрос возник: на сколько приведенный пример оптимизирован? - нужно для сайта с большой посещалкой.


Насколько я помню, когда пишешь селект, то в where первым должно идти самое строгое условие, то есть то, которое отсеет максимальное количество лишних записей. Следом за ним - чуть менее строгое и так далее.
То есть тут все зависит от содержания таблицы dle_post и смысла полей approve, short_story, title
7. qbik - 24 Июня, 2010 - 13:37:54 - перейти к сообщению
isle пишет:
на сколько приведенный пример оптимизирован? - нужно для сайта с большой посещалкой.

$sql = "explain ".$твойзапрос очень помогает
конечно желательно чтоб база была побольше и поразличнее, полезно rnd накидать
ну и индексов набрать по смыслу

зы как минимум, у каждого проверяемого параметра в where желательно, чтоб был индекс
8. JustUserR - 24 Июня, 2010 - 15:31:42 - перейти к сообщению
isle пишет:
Если вместо p.category='$category' вписать конкретную категорию, то работает, иначе - никак
Можете к примеру использовать вложенный SQL-запрос - а именно во вложенном запросе вы выбираете все категории к которым принадлежит ваша статья - и во внешнем запросе выбираете все статьи категории которых находятся среди списка выбранных - это можно реализовать оператором IN

 

Powered by ExBB FM 1.0 RC1