MYSQL: как вернуть все отдельные строки в запросе GROUP BY mysql - PullRequest
3 голосов
/ 16 ноября 2011

У меня есть таблица T с некоторым столбцом и значениями

T
========================
id |   name |   g1 |  g2 
=========================
 10 |  abc   |   1  | 1
 14 |  abc   |   1  | 0
 33 |  abc   |   1  | 0
 42 |  def   |   1  | 0 
 52 |  def   |   1  | 1
 63 |  def   |   2  | 0
 66 |  def   |   2  | 0
 67 |  def   |   2  | 0
 74 |  def   |   1  | 0

и я хочу выделить всю строку округа с помощью предложения group *

мой запрос

select * 
from T 
group by name 
having max(g2) = 0

мой ожидаемый результат будет

    ========================
    id |   name |   g1 |  g2 
    =========================
     14 |  abc   |   1  | 0
     33 |  abc   |   1  | 0
     42 |  def   |   1  | 0 
     63 |  def   |   2  | 0
     66 |  def   |   2  | 0
     67 |  def   |   2  | 0
     74 |  def   |   1  | 0

** я добавил max (g2), потому что мне нужно сделать предложение add where повторяет каждую группу. : D спасибо за ответы. Мне нужны агрегаты, чтобы ограничить возврат (имея пункт). другая работа вокруг имеет подзапрос

мой MySQL возвращает только первый ряд каждой группы

    ========================
    id |   name |   g1 |  g2 
    =========================
     14 |  abc   |   1  | 0
     42 |  def   |   1  | 0 

игнорирование всех различий в другом столбце (id и g1).

как я помню, используя другие СУБД (oracle и MsSQL или MySQL), я могу ожидать, что мой запрос выдаст ожидаемый результат выше. возвращая все разные строки.

или есть какие-либо настройки mySQL, которые нужно изменить ??

я уже пробовал SET sql_mode=ONLY_FULL_GROUP_BY, но он просто показывает уведомление, чтобы указать столбец, в моем понимании не указание имени столбца в предложении group by означает показать все строки с другим значением столбца.

или, нужно ли указывать какие-либо настройки sql_mode ?? или хотя бы почему MySQL возвращает только первый ряд группы ???

set @@global.sql_mode= 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER'

set @@sql_mode=''

заранее благодарю за любые ответы ...

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011
Предложение

group by не используется для этой цели ни в одной базе данных.

select * 
from T 
where g2 =0
order by name

этот запрос должен служить вашей цели

Вот простое объяснение предложения GroupBy. Предложение GroupBy обычно используется с агрегатными функциями. http://www.w3schools.com/sql/sql_groupby.asp

2 голосов
/ 16 ноября 2011

Попробуйте это -

SELECT t1.* FROM t t1
  LEFT JOIN (
    SELECT name, g1, g2, MIN(id) id FROM t
      GROUP BY name, g1, g2
      HAVING COUNT(*) = 1
    ) t2
  ON t1.name = t2.name AND t1.g1 = t2.g1 AND t1.g2 = t2.g2
WHERE t2.id IS NULL;

Этот запрос вернет все записи-дубликаты.

Мой вывод:

+------+------+------+------+
| id   | name | g1   | g2   |
+------+------+------+------+
|   14 | abc  |    1 |    0 |
|   33 | abc  |    1 |    0 |
|   42 | def  |    1 |    0 |
|   63 | def  |    2 |    0 |
|   66 | def  |    2 |    0 |
|   67 | def  |    2 |    0 |
|   74 | def  |    1 |    0 |
+------+------+------+------+
...