Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сложная выборка уникальных значений
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Сложная выборка уникальных значений

Страниц (1): [1]
 

1. Deonis - 07 Ноября, 2012 - 01:22:04 - перейти к сообщению
Здравствуйте! Задача выбрать уникальные значения val для каждой записи name. То есть, к примеру, есть такая таблица:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. +---------+-------------+
  3. | name    |     val     |
  4. +---------+-------------+
  5. | Вася    |     10      |
  6. | Вася    |     30      |
  7. | Вася    |     10      |
  8. | Петя    |     60      |
  9. | Петя    |     60      |
  10. | Петя    |     30      |
  11. | Петя    |     15      |
  12. +---------+-------------+
  13.  


В глобальном рассмотрении, тут одно уникальное значение - 15, но в результате запроса, над которым и бьюсь, нам нужно получить уникальное значение val для "Вася" - это 30 и для "Петя" уникальные значения val - 30 и 15. Если наталкнете на то, как лучше составить такой запрос, то буду признателен.
2. armancho7777777 - 07 Ноября, 2012 - 02:22:02 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `val` FROM `table_name` GROUP BY `val` HAVING COUNT(*) = 1
?
3. Deonis - 07 Ноября, 2012 - 02:53:27 - перейти к сообщению
armancho7777777 пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `val` FROM `table_name` GROUP BY `val` HAVING COUNT(*) = 1
?


Если б всё так просто было Улыбка Я может путано объяснил... Попробую так: в данном примере, есть Вася и Петя, у которых по три значения. У Васи есть одно уникальное значение, которое надо вычислить - это "30", а у Пети - есть два уникальных значения, которые так же надо получить - это "30" и "15". То есть, нам без разницы, есть такие же значения у кого-то еще или нет, но важно, чтоб для каждого имени найти его уникальные значения. В итоге, результат выборки именно по этому примеру, должен быть:

CODE (htmlphp):
скопировать код в буфер обмена
  1. +---------+-------------+
  2. | name    |     val     |
  3. +---------+-------------+
  4. | Вася    |     30      |
  5. | Петя    |     30      |
  6. | Петя    |     15      |
  7. +---------+-------------+
4. armancho7777777 - 07 Ноября, 2012 - 03:15:38 - перейти к сообщению
Ну и?
В чём проблема?
У меня запрос, который Вам предложил Выше, работает.

Нажмите для увеличения
5. Deonis - 07 Ноября, 2012 - 03:49:06 - перейти к сообщению
armancho7777777 пишет:
Ну и?
В чём проблема?
У меня запрос, который Вам предложил Выше, работает


Он работает, только по той причине, что заполнена таблица таким образом. Вот простейший случай, где это уже перестанет работать - http://sqlfiddle[dot]com/#!2/b3336/1/0
(!!!Ссылку скопируйте, т.к. парсер форума видать режет её после хеша)

UPD

В общем, выход на данный момент нашел следующий:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `name`,`val`, CONCAT(`name`,`val`) AS uv FROM `uniq` GROUP BY uv HAVING COUNT(uv) = 1


В итоге, получаем - http://sqlfiddle[dot]com/#!2/16b7b/1/0
6. armancho7777777 - 07 Ноября, 2012 - 04:50:48 - перейти к сообщению
Блин, что-то разницу в таблицах не могу найти...
(Добавление)
... из - за которой не работает.
7. EuGen - 07 Ноября, 2012 - 08:10:01 - перейти к сообщению
Лучше, чем CONCAT (будет использовать индексы, если присутствуют):
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `val`, `name`, count(*) AS total_count FROM `uniq` GROUP BY `val`,`name` HAVING `total_count`=1

?

 

Powered by ExBB FM 1.0 RC1