Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как упростить запрос??? / 14 сообщений из 14, страница 1 из 1
17.09.2013, 19:16:31
    #38399310
degggg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
Код: sql
1.
2.
3.
4.
5.
6.
7.
$post=$this->db->fetch_array_all("SELECT * FROM `post` ORDER BY `id` DESC LIMIT 0, 10;");

$type_1=$this->db->fetch_array_all("SELECT COUNT(*) FROM `smile` WHERE `post_id` = ".$this->db->quote_($this->id)." AND `enabled` = 1 AND `type_smile` = 1;");

$type_2=$this->db->fetch_array_all("SELECT COUNT(*) FROM `smile` WHERE `post_id` = ".$this->db->quote_($this->id)." AND `enabled` = 1 AND `type_smile` = 2;");

$type_3=$this->db->fetch_array_all("SELECT COUNT(*) FROM `smile` WHERE `post_id` = ".$this->db->quote_($this->id)." AND `enabled` = 1 AND `type_smile` = 3;");



Можно ли не отправлять 3 запроса, а выполнить 1 и чтобы ни сказывалось на производительности

У каждого поста есть 3 смайла:

:) это хорошо
-) это нормально
:( это плохо

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

В итоге считаем

Допустим на странице нужно вывести 10 последних тем, для каждой темы нужно вывести смайлы и того получается 30 запросов!!!

Как можно упростить?

Вот так будет выглядеть

...
Рейтинг: 0 / 0
17.09.2013, 19:17:17
    #38399312
degggg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
...
Рейтинг: 0 / 0
17.09.2013, 19:25:08
    #38399321
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
Код: sql
1.
2.
3.
4.
5.
SELECT `post`.*,
  (SELECT COUNT(*) FROM `smile` WHERE `smile`.`post_id`=`post`.`id` AND `enabled` = 1 AND `type_smile` = 1) `smile_positive`,
  (SELECT COUNT(*) FROM `smile` WHERE `smile`.`post_id`=`post`.`id` AND `enabled` = 1 AND `type_smile` = 2) `smile_neutral`,
  (SELECT COUNT(*) FROM `smile` WHERE `smile`.`post_id`=`post`.`id` AND `enabled` = 1 AND `type_smile` = 3) `smile_negative`
FROM `post` ORDER BY `id` DESC LIMIT 0, 10
...
Рейтинг: 0 / 0
17.09.2013, 19:58:20
    #38399334
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
может так будет "дешевле" ... (?)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT `post`.*,
  a.`smile_positive`,
  a.`smile_neutral`,
  a.`smile_negative`
FROM `post` 
left join
  (SELECT `post_id`, sum(`type_smile` = 1) as `smile_positive`, sum(`type_smile` = 2) as `smile_neutral`, sum(`type_smile` = 3) as `smile_negative`
  FROM `smile` WHERE `enabled` = 1 and `type_smile` in (1,2,3) group by `post_id`) a
on a.`post_id`=`post`.`id` 
ORDER BY `post`.`id` DESC LIMIT 0, 10
...
Рейтинг: 0 / 0
17.09.2013, 20:00:27
    #38399335
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT p.*,
  IFNULL(SUM(s.type_smile=1),0) `smile_positive`,
  IFNULL(SUM(s.type_smile=2),0) `smile_neutral`,
  IFNULL(SUM(s.type_smile=3),0) `smile_negative`
FROM `post` p
LEFT JOIN `smile` s ON s.post_id=p.id AND s.enabled=1 AND s.type_smile in (1,2,3)
GROUP BY p.ID DESC 
LIMIT 0, 10



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT p.*,
  IFNULL(s.s1,0) `smile_positive`,
  IFNULL(s.s2,0) `smile_neutral`,
  IFNULL(s.s3,0) `smile_negative`
FROM `post` p
LEFT JOIN(
  SELECT s.post_id, SUM(s.type_smile=1) s1, SUM(s.type_smile=2) s2, SUM(s.type_smile=3) s3
  FROM `smile` s 
  WHERE s.enabled=1 AND s.type_smile in (1,2,3)
  GROUP BY s.post_id
  ) s ON s.post_id=p.id 
ORDER BY p.ID DESC 
LIMIT 0, 10
...
Рейтинг: 0 / 0
17.09.2013, 20:00:43
    #38399336
degggg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
miksoft
Код: sql
1.
2.
3.
4.
5.
SELECT `post`.*,
  (SELECT COUNT(*) FROM `smile` WHERE `smile`.`post_id`=`post`.`id` AND `enabled` = 1 AND `type_smile` = 1) `smile_positive`,
  (SELECT COUNT(*) FROM `smile` WHERE `smile`.`post_id`=`post`.`id` AND `enabled` = 1 AND `type_smile` = 2) `smile_neutral`,
  (SELECT COUNT(*) FROM `smile` WHERE `smile`.`post_id`=`post`.`id` AND `enabled` = 1 AND `type_smile` = 3) `smile_negative`
FROM `post` ORDER BY `id` DESC LIMIT 0, 10




Идейку подкинули с sum так я написал свой вариант
Результат будет таким же или я что то напутал?
И какой быстрее будет работать?

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT `post`.*,
sum(CASE `smile`.`type_smile` WHEN 1 THEN 1 ELSE 0 END ) AS type1, 
sum(CASE `smile`.`type_smile` WHEN 2 THEN 1 ELSE 0 END ) AS type2, 
sum(CASE `smile`.`type_smile` WHEN 3 THEN 1 ELSE 0 END ) AS type3
FROM `post`
LEFT JOIN `smile` ON `post`.`id` = `smile`.`post_id`
WHERE `post`.`enabled` = 1 AND `smile`.`enabled` = 1;
...
Рейтинг: 0 / 0
17.09.2013, 20:05:13
    #38399339
degggg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
Очень важна скорость выполнения запроса
Какой из вариантов наиболее оптимизирован?
...
Рейтинг: 0 / 0
17.09.2013, 20:05:21
    #38399340
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
degggg,

Вы слишком упростили, GROUP BY потерялся.
...
Рейтинг: 0 / 0
17.09.2013, 20:08:24
    #38399341
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
qwerty112может так будет "дешевле" ... (?)deggggКакой из вариантов наиболее оптимизирован?Зависит от имеющихся индексов.
...
Рейтинг: 0 / 0
17.09.2013, 20:12:30
    #38399344
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
deggggОчень важна скорость выполнения запроса
Какой из вариантов наиболее оптимизирован?
Код: sql
1.
create index IX_smile__postid_enabled_type on smile(post_id,enabled,type_smile);
...
Рейтинг: 0 / 0
17.09.2013, 20:15:47
    #38399345
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
Что-то я уже плохо соображаю под вечер. А разве подзапрос с GROUP BY-ем не будет всегда вычисляться полностью, да еще с материализацией?
...
Рейтинг: 0 / 0
17.09.2013, 21:15:58
    #38399374
degggg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
А как в этот запрос еще уместить подсчет общего количества строк в таблице?

Код: sql
1.
SELECT COUNT(*) FROM `smile` WHERE `post_id` = ".$this->db->quote_($this->id)." AND `enabled` = 1
...
Рейтинг: 0 / 0
17.09.2013, 22:12:10
    #38399413
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
miksoftЧто-то я уже плохо соображаю под вечер. А разве подзапрос с GROUP BY-ем не будет всегда вычисляться полностью, да еще с материализацией?Вообще-то да, должно бы, но ведь можно попробовать и
Код: sql
1.
group by s.post_id desc limit 10

если и будет хуже, то вряд ли значительно... :)
А индекс для любого варианта пригодится

Да и тестировать пристало ТС как владельцу данных, ятд
...
Рейтинг: 0 / 0
17.09.2013, 22:42:52
    #38399434
degggg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как упростить запрос???
Спасибо всем огромное за помощь!
Все доделал
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как упростить запрос??? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]