powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как правильно написать запрос?
11 сообщений из 11, страница 1 из 1
как правильно написать запрос?
    #38834452
mmm3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица

CREATE TABLE IF NOT EXISTS `DisPacket` (
`Inc` int(11) NOT NULL,
`Hotel` int(11) NOT NULL,
`Tour` int(11) NOT NULL,
`Meal` int(11) NOT NULL,
`CheckIn` datetime NOT NULL,
`TownFrom` int(11) DEFAULT NULL,
`State` int(11) DEFAULT NULL,
`Enable` bit(1) DEFAULT NULL,
`ptype` int(11) NOT NULL,
PRIMARY KEY (`Inc`),
KEY `T_s` (`TownFrom`,`State`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Пишем запрос SELECT * FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4

нужно в этой выборке получить все уникальные значения в поле meal
нужно в этой выборке получить все уникальные значения в поле Hotel
нужно в этой выборке получить все уникальные значения в поле Tour
нужно в этой выборке получить все уникальные значения в поле CheckIn

как это лучше сделать?

или это писать 4 запроса вида?

SELECT meal FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4 group by meal;
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834465
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmm3или это писать 4 запроса вида?

SELECT meal FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4 group by meal;Ну да, так и писать.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834571
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmm3,
Код: sql
1.
2.
3.
4.
5.
6.
select 
(SELECT distinct meal FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4) as  meal
(SELECT distinct Hotel FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4) as Hotel
(SELECT distinct Tour FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4) as Tour
(SELECT distinct CheckIn FROM `DisPacket` WHERE `TownFrom` = 2 AND `State` = 4) as CheckIn
;




Учи SQL.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834707
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv , syntax error адназначна.

mmm3нужно в этой выборке получить все уникальные значения в поле meal
нужно в этой выборке получить все уникальные значения в поле Hotel
нужно в этой выборке получить все уникальные значения в поле Tour
нужно в этой выборке получить все уникальные значения в поле CheckIn
Чё, вот прям в ОДНОЙ выборке? сам-то как себе это представляешь?

mmm3или это писать 4 запроса
Угу. Только не группировать, а тупо DISTINCT - зачем лишние ресурсы жрать?
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834755
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТолько не группировать, а тупо DISTINCT - зачем лишние ресурсы жрать?А что, есть практически доказуемая разница?
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834897
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftесть практически доказуемая разница?
GROUP BY выдаёт результаты в сортированном порядке, DISTINCT - в произвольном. И я скорее предположу, что в первом случае имеется дополнительная сортировка, чем что во втором выполняется целенаправленное разупорядочивание. Понимаю, что разница скорее всего ничтожна - но она таки есть.
Насчёт поймать практически - не знаю, не пробовал. Это нужны большие средневариабельные массивы (коих тупо нет, генерить же влом) - но на них основное время будет тратиться на вывод, а не на выполнение запроса.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834905
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaGROUP BY выдаёт результаты в сортированном порядке, DISTINCT - в произвольном. И я скорее предположу, что в первом случае имеется дополнительная сортировка, чем что во втором выполняется целенаправленное разупорядочивание.А я бы предположил, что вряд ли в MySQL более одного алгоритма для столь схожих действий. Он и в более важных случаях не балует разнообразием.

Кстати, для GROUP BY сортировку можно выключить с помощью ORDER BY NULL.
Правда, дает ли это какой-либо практический эффект - не знаю, не было повода проверить.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38834914
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по беглому поиску, копья я на тему GROUP BY/DISTINCT ломаются давно, но почти везде народ сходится к тому, что одинаково.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38835028
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА я бы предположил, что вряд ли в MySQL более одного алгоритма для столь схожих действий. Он и в более важных случаях не балует разнообразием.
В случае GROUP BY набор отдаётся в сортированном порядке. В случае DISTINCT - в порядке, в котором значения встречаются в первый раз при сортировке по первичному индексу, во всяком случае при фулскане. Если алгоритм один - то и результат должен быть один. Так что разница явно имеет место быть. Опять же явное указание, что ORDER BY NULL отключает сортировку, свидетельствует о том, что в обычном случае она присутствует как отдельный этап обработки.

Это для сравнительно небольших выходных массивов, которые могут быть сортированы в памяти без кэширования на диск. Думаю, что для больших массивов разница станет заметна.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38835035
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Спорить не буду, практических замеров у меня нет. Но ежели у Вас появятся - было бы любопытно взглянуть.
...
Рейтинг: 0 / 0
как правильно написать запрос?
    #38835105
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять же тупо. В таблице 2 поля - автоинкремент и INT. Вот эксплейны:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mysql> explain select distinct val from test;
+----+-------------+-------+------+---------------+------+---------+------+--------+-----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra           |
+----+-------------+-------+------+---------------+------+---------+------+--------+-----------------+
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL | 101706 | Using temporary |
+----+-------------+-------+------+---------------+------+---------+------+--------+-----------------+
1 row in set (0.04 sec)

mysql> explain select val from test group by val;
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra                           |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL | 101706 | Using temporary; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+



Как видно, группировка добавляет filesort. Значит, чтобы ощутить разницу, достаточно обработать такой массив данных, чтобы filesort кэшированных данных занимал ощутимое время.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как правильно написать запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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