Объединение 2-х запросов выборки в 1

sage

Новичок
Объединение 2-х запросов выборки в 1

есть задача выводить популярные товары, где "популярные товары" - три наиболее часто встречающихся (самых покупаемых) товара в таблице `o_items`. Сейчас сделал 2-мя запросами:
[sql]SELECT `model_id`, COUNT(*) AS `o_count` FROM `o_items` GROUP BY `model_id` ORDER BY `o_count` DESC LIMIT 3[/sql]
затем прохожу по результату данного запроса и и на каждой итерации достаю параметры товара:
[sql]SELECT DISTINCT ...
FROM `items` WHERE `model_id` = ... [/sql]
можно ли как-нить эти 2 запроса объединить в один? спасибо.
 

alpine

Новичок
sage
можно ли как-нить эти 2 запроса объединить в один? спасибо.
Зачем?
затем прохожу по результату данного запроса и и на каждой итерации достаю параметры товара:
Вместо трех дапросов сделай 1 с конструкцией `model_id` IN(1,2,3)
 

alpine

Новичок
sage
Да можно, но не нужно, потому что будет тормознее если объединять джоином. Если использовать подзапрос потеряешь совместимость с 4.0 и никакого выигрыша в производительности. Понимаешь, чем проще запрос тем он быстрее выполняется и тем легче его модифицировать. Стараться все запхнуть в один большой запрос - зло!
 

sage

Новичок
проект изначально пишется под 4.1 и потерять совместимость с 4.0 не боюсь ;)
 

alpine

Новичок
zerkms
В данном конкретном случае "на глазок". А как еще? У меня сейчас нет ни его данных, ни структуры таблиц.
 

zerkms

TDD infected
Команда форума
alpine
угу, данных нет, однако вы себе позволяете давать оценки. притом весьма абсурдные.
я вам завидую ;)

-~{}~ 03.11.06 22:21:

собственно по теме:

[sql]
SELECT * , COUNT( * ) AS `o_count`
FROM `o_items` `o`
INNER JOIN `items` `i` ON `i`.`model_id` = `o`.`model_id`
GROUP BY `model_id`
ORDER BY `o`.`o_count` DESC
LIMIT 3
[/sql]

если я ничего не напутал - то запрос будет такой
 

alpine

Новичок
zerkms
угу, данных нет, однако вы себе позволяете давать оценки. притом весьма абсурдные.
А чем собственно ваши сомнения подтверждены? У вас есть какие-то конкретные цифры по конкретным запросам(желательно каксающимся задачи в этом топике)?
 

zerkms

TDD infected
Команда форума
alpine
4 запроса не могут быть быстрее аналогичного 1 запроса с джоином
 

alpine

Новичок
zerkms
Уважаемый, я написал что сделать 2 запроса, и написал как. Причем 2 запроса независимо от значения в LIMIT.
 

zerkms

TDD infected
Команда форума
alpine
ладно, будь по вашему. 2 запроса не могут быть быстрее и эффективнее, чем 1 (в контексте этой ситуации)
 

alpine

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

-~{}~ 03.11.06 14:59:

zerkms
ладно, будь по вашему.
Не стоит одолжений, просто будьте внимательнее.
2 запроса не могут быть быстрее и эффективнее, чем 1 (в контексте этой ситуации)
Вы "на глаз" определили? Имхо без тестов дальше спорить не имеет смысла.
 

zerkms

TDD infected
Команда форума
Код:
mysql> EXPLAIN SELECT * FROM `sys_access` `a`
    ->  INNER JOIN `user_user` `u` ON `u`.`id` = `a`.`uid`
    ->   WHERE `a`.`id` < 10;
+----+-------------+-------+--------+---------------+---------+---------+-----------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref    | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+-----------+------+-------------+
|  1 | SIMPLE      | a     | range  | PRIMARY       | PRIMARY |       4 | NULL    |    1 | Using where |
|  1 | SIMPLE      | u     | eq_ref | PRIMARY       | PRIMARY |       4 | mzz.a.uid |    1 |             |
+----+-------------+-------+--------+---------------+---------+---------+-----------+------+-------------+
2 rows in set (0.00 sec)
По поводу джоина, даже без експлейна понятно что будет создаваться временная таблица
джоин есть. Using temporary нет.

-~{}~ 03.11.06 23:04:

Вы "на глаз" определили? Имхо без тестов дальше спорить не имеет смысла.
прокомментируете EXPLAIN ? :)
 

alpine

Новичок
zerkms
Уважаемый, а где же GROUP BY и ORDER BY в вашем експлейне?

-~{}~ 03.11.06 15:05:

Ведь вы же сами предложили вот этот запрос:
SELECT * , COUNT( * ) AS `o_count`
FROM `o_items` `o`
INNER JOIN `items` `i` ON `i`.`model_id` = `o`.`model_id`
GROUP BY `model_id`
ORDER BY `o`.`o_count` DESC
LIMIT 3

-~{}~ 03.11.06 15:07:

А показываете мне простой джоин по праймари кей, ая-яй, как вам не стыдно ;)
 

zerkms

TDD infected
Команда форума
alpine
вы сказали что временная таблица нужна для джоинов
для джоинов её нет.
для группировки temporary table будет и без join

Код:
mysql> EXPLAIN SELECT * FROM `sys_access` GROUP BY `uid` ORDER BY `id`;
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | SIMPLE      | sys_access | ALL  | NULL          | NULL |    NULL | NULL |  215 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
 

alpine

Новичок
zerkms
Не перекручивайте, я сказал что она будет создаваться при запросе который вы написали. И я не говорил что она не будет создаваться для простого запроса. Короче, будут тесты будем их обсуждать а пока я при своем имхо.
 

zerkms

TDD infected
Команда форума
alpine
угу, т.е. ваши запросы с временной таблицей медленнее предложенного мной с той же временной таблицей. при том что в случае с одним запросом исключается время на передачу данных. нюню... ;)

ps: решать в итоге автору, думаю он почерпнёт что-либо полезное из этой перепалки
pps: от вас, кстати, ни одной даже попытки показать что 2 запроса быстрее 1 не было ;)
 
Сверху