Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Уникальность по паре параметров без DISTINCT
 
 автор: Владимир55   (27.05.2013 в 20:41)   письмо автору
 
 

Требуется из таблицы выбрать полное содержимое строк, для которых являются уникальными значения двух полей (попарно). Использую вот такой код:
$query = "SELECT * FROM select_detal GROUP BY `BRAND`, `NUMBER`";


Вроде бы, работает, но я сомневаюсь - корректно ли это?

  Ответить  
 
 автор: cheops   (27.05.2013 в 21:26)   письмо автору
 
   для: Владимир55   (27.05.2013 в 20:41)
 

>уникальными значения двух полей (попарно).
Следующие наборы разные (два уникальных значений) или одинаковые (одно уникальное значение)?
BRAND = 1, NUMBER = 2
BRAND = 2, NUMBER = 1

Если разные (два уникальных значения), ваш запрос верен.

  Ответить  
 
 автор: Sfinks   (28.05.2013 в 10:29)   письмо автору
 
   для: Владимир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`

  Ответить  
 
 автор: Владимир55   (28.05.2013 в 11:36)   письмо автору
 
   для: Sfinks   (28.05.2013 в 10:29)
 

Интересно было бы узнать, а можно ли построить код на основе DISTINCT?

Если сделать так:
SELECT DISTINCT `BRAND`, `NUMBER`  FROM select_detal 
то возвращаются только два параметра - BRAND и `NUMBER. Как вернуть всю строку?
(любую строку, содержащую эту пару).

  Ответить  
 
 автор: Sfinks   (28.05.2013 в 14:58)   письмо автору
 
   для: Владимир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 оставляет уникальные строки в пределах результата выборки.
Т.е. по всем полям выборки.
Т.е. для вашей задачи нельзя.

  Ответить  
 
 автор: Владимир55   (02.06.2013 в 16:07)   письмо автору
 
   для: Sfinks   (28.05.2013 в 14:58)
 

Это код не пошел:
Can't reopen table: 'select_detal'


( PRIMARY KEY(id) )

  Ответить  
 
 автор: Sfinks   (03.06.2013 в 10:30)   письмо автору
 
   для: Владимир55   (02.06.2013 в 16:07)
 

select_detal - это временная таблица? Если да, то так и должно быть: TEMPORARY Table Problems

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования