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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сложная выборка уникальных значений

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Deonis
Отправлено: 07 Ноября, 2012 - 01:22:04
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Здравствуйте! Задача выбрать уникальные значения 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. Если наталкнете на то, как лучше составить такой запрос, то буду признателен.
 
 Top
armancho7777777 Супермодератор
Отправлено: 07 Ноября, 2012 - 02:22:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `val` FROM `table_name` GROUP BY `val` HAVING COUNT(*) = 1
?

(Отредактировано автором: 07 Ноября, 2012 - 02:25:41)

 
 Top
Deonis
Отправлено: 07 Ноября, 2012 - 02:53:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




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. +---------+-------------+
 
 Top
armancho7777777 Супермодератор
Отправлено: 07 Ноября, 2012 - 03:15:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Ну и?
В чём проблема?
У меня запрос, который Вам предложил Выше, работает.

Нажмите для увеличения
 
 Top
Deonis
Отправлено: 07 Ноября, 2012 - 03:49:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




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.com/#!2/16b7b/1/0

(Отредактировано автором: 07 Ноября, 2012 - 04:10:35)

 
 Top
armancho7777777 Супермодератор
Отправлено: 07 Ноября, 2012 - 04:50:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Блин, что-то разницу в таблицах не могу найти...
(Добавление)
... из - за которой не работает.
 
 Top
EuGen Администратор
Отправлено: 07 Ноября, 2012 - 08:10:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Лучше, чем CONCAT (будет использовать индексы, если присутствуют):
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `val`, `name`, count(*) AS total_count FROM `uniq` GROUP BY `val`,`name` HAVING `total_count`=1

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB