|
|
|
| Требуется из таблицы выбрать полное содержимое строк, для которых являются уникальными значения двух полей (попарно). Использую вот такой код:
$query = "SELECT * FROM select_detal GROUP BY `BRAND`, `NUMBER`";
|
Вроде бы, работает, но я сомневаюсь - корректно ли это? | |
|
|
|
|
|
|
|
для: Владимир55
(27.05.2013 в 20:41)
| | >уникальными значения двух полей (попарно).
Следующие наборы разные (два уникальных значений) или одинаковые (одно уникальное значение)?
BRAND = 1, NUMBER = 2
BRAND = 2, NUMBER = 1
|
Если разные (два уникальных значения), ваш запрос верен. | |
|
|
|
|
|
|
|
для: Владимир55
(27.05.2013 в 20:41)
| | > но я сомневаюсь - корректно ли это?
правильно сомневаетесь. Это не корректно.
Хотя MySQL что-то и вернет, но вернет он именно "что-то" не предсказуемое на свое усмотрение.
Например MsSQL сразу вернет ошибку, т.к. корректный запрос должен обязан возвращать однозначный результат.
Для этого в списке полей выборки должны быть только поля, перечисленные в GROUP BY. Все остальные поля должны быть обработаны агрегатными функциями. т.е. функциями, возвращающими одно значение из набора значений: min(), max(), sum() и т.д.
Например у нас есть таблица:
BRAND | NUMBER | CO
-------------------
1 | 2 | 3
1 | 2 | 4
| Что вернет Ваш запрос? Может первую строку, а может вторую.
А правильно будет так:
SELECT `BRAND`, `NUMBER`, min(`CO`)
FROM select_detal
GROUP BY `BRAND`, `NUMBER`
|
| |
|
|
|
|
|
|
|
для: Sfinks
(28.05.2013 в 10:29)
| | Интересно было бы узнать, а можно ли построить код на основе DISTINCT?
Если сделать так:
SELECT DISTINCT `BRAND`, `NUMBER` FROM select_detal
| то возвращаются только два параметра - BRAND и `NUMBER. Как вернуть всю строку?
(любую строку, содержащую эту пару). | |
|
|
|
|
|
|
|
для: Владимир55
(28.05.2013 в 11:36)
| | > любую строку, содержащую эту пару
Если так, то для Мускула подойдет и Ваш изначальный вариант.
Если "по-фен-шую", то можно так (допустим, что в таблице PRIMARY KEY `id`):
SELECT *
FROM `select_detal`
WHERE `id` IN( SELECT max(`id`)
FROM `select_detal`
GROUP BY `BRAND`,`NUMBER` )
|
> Интересно было бы узнать, а можно ли построить код на основе DISTINCT
DISTINCT оставляет уникальные строки в пределах результата выборки.
Т.е. по всем полям выборки.
Т.е. для вашей задачи нельзя. | |
|
|
|
|
|
|
|
для: Sfinks
(28.05.2013 в 14:58)
| | Это код не пошел:
Can't reopen table: 'select_detal'
|
( PRIMARY KEY(id) ) | |
|
|
|
|
|
|
|
для: Владимир55
(02.06.2013 в 16:07)
| | select_detal - это временная таблица? Если да, то так и должно быть: TEMPORARY Table Problems | |
|
|
|