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]   

> Без описания
nkl
Отправлено: 06 Мая, 2014 - 08:03:52
Post Id



Посетитель


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


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




Есть таблица comments(id, object_type, object_id, comment),
Заполняется примерно так:
1|post|2|Lorem ipsum bla-bla-bla
2|article|567|Bla-bla-bla
3|goods|1255|asd asda sdad
4|post|4|asd asdasd

И есть таблица blogs(id, published, deleted, post_text),
Заполняется примерно так:
1|1|0|asd asdasdasd
2|1|1|asdas asdasdasd
3|0|0|asdas asdasdasdas
4|1|0|asdkasjdlas asldkajdl

Так вот задача. Мне нужно выбрать последние 10 комментов, при этом исключить из этого списка комменты, которые относятся к постам, у которых published = 0 и deleted = 1 (в примере в выборку должны попасть все комменты, кроме первого).

Попробовал сделать на PHP, но уж слишком громоздко и неповоротливо это получается. Начальник сказал сделать все это одним аЦким запросом.

Есть мысли на этот счет?
(Добавление)
А и еще, чуть не забыл, в итоге должно быть ровно 10 последних камментов.
(Добавление)
Кому интересно, запрос написал, вот как он выглядит:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT tt.* FROM
  2. (
  3. SELECT * FROM bs_comments bc
  4.   WHERE bc.object_type <> 'post' AND deleted = 0  
  5.  
  6. UNION ALL
  7.  
  8. SELECT bc.* FROM bs_comments bc
  9.   RIGHT JOIN bs_blog bb ON bb.id = bc.object_id
  10.   WHERE bc.object_type = 'post' AND bb.published = 1 AND bc.deleted = 0 AND bb.deleted = 0
  11.   ) AS tt  
  12. ORDER BY tt.id DESC
  13.   LIMIT 10;
 
 Top
Мелкий Супермодератор
Отправлено: 06 Мая, 2014 - 09:35:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Можно и в один select запихать:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT bc.* FROM bs_comments bc
  2.   LEFT JOIN bs_blog bb ON bb.id = bc.object_id
  3. WHERE bc.deleted = 0 AND (bc.object_type <> 'post' OR (bc.object_type = 'post' AND bb.published = 1 AND bb.deleted = 0))
  4. ORDER BY tt.id DESC
  5.   LIMIT 10;


-----
PostgreSQL DBA
 
 Top
nkl
Отправлено: 06 Мая, 2014 - 12:07:28
Post Id



Посетитель


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


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




Спасибо. Но в моем случае разницы особой нет, все равно потом не то что бы результат запроса, а весь html для которого выдергиваются данные этим запросом попадают в кэш.
 
 Top
Zuldek
Отправлено: 06 Мая, 2014 - 12:35:56
Post Id


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


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


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




Будут другие запросы когда будет развиваться проект. И когда полезут обновлять кэш в самый неожиданный момент обвалят сервер.
Я иной раз возвращаюсь к проектам двухлетней давности чтобы оптимизировать запросы и в результате, если повозиться, можно уменьшить время выполнения чуть ли не в разы, потому что когда делалось торопился и не уделил должного внимания оптимизации.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB