выбор, когда в столбце агрегирования есть два или более элементов - PullRequest
1 голос
/ 06 мая 2010

Допустим, у меня был такой запрос:

SELECT * FROM (
  SELECT 'a' AS a, '1' AS b
UNION 
  SELECT 'a' AS a, '2' AS b
UNION
  SELECT 'b' AS a, '1' AS b) AS a 
GROUP BY a.a 

В этом случае «a» .b - это агрегат, равный 1,2, а «b» .b - только агрегат, равный 1.

Как выбрать только «а»?

Вопрос обновлен, чтобы быть немного яснее:

Давайте возьмем этот очень похожий запрос:

SELECT *, GROUP_CONCAT(b) FROM (
  SELECT 'a' AS a, '1' AS b
UNION 
  SELECT 'a' AS a, '2' AS b
UNION
  SELECT 'a' AS a, '3' AS b
UNION
  SELECT 'b' AS a, '1' AS b
UNION
  SELECT 'b' AS a, '2' AS b
) AS a 
GROUP BY a.a

Теперь a.b равно 1,2,3, а b.b равно 1,2:

Я хочу выбрать, исходя из того, что он имеет 1, 2 и 3.

Ответы [ 3 ]

0 голосов
/ 06 мая 2010

Попробуйте:

SELECT a.a,COUNT(*) AS CountOf FROM (
  SELECT 'a' AS a, '1' AS b
UNION 
  SELECT 'a' AS a, '2' AS b
UNION
  SELECT 'b' AS a, '1' AS b) AS a 
GROUP BY a.a
HAVING  COUNT(*) > 1

ВЫХОД:

a    CountOf
---- -----------
a    2

(1 row(s) affected)

РЕДАКТИРОВАТЬ на основе комментария ОП:

Это не будетв ситуации, когда ab было 1,2,3, а bb было 1,2

, попробуйте это:

SELECT TOP 1 a.a,COUNT(*) AS CountOf FROM (
  SELECT 'a' AS a, '1' AS b
UNION 
  SELECT 'a' AS a, '2' AS b
UNION 
  SELECT 'a' AS a, '3' AS b
UNION 
  SELECT 'b' AS a, '1' AS b
UNION
  SELECT 'b' AS a, '2' AS b) AS a 
GROUP BY a.a
ORDER BY 2 DESC

ВЫХОД:

a    CountOf
---- -----------
a    3

(1 row(s) affected)
0 голосов
/ 07 мая 2010

Мне кажется, что работает следующее:

SELECT a,b FROM (
    SELECT a,b FROM (
      SELECT 'a' AS a, '1' AS b
    UNION 
      SELECT 'a' AS a, '2' AS b
    UNION
      SELECT 'a' AS a, '3' AS b
    UNION
      SELECT 'b' AS a, '1' AS b
    UNION
      SELECT 'b' AS a, '2' AS b
    ) AS a 
) b WHERE b.b IN ({x1},{x2}...)
GROUP BY b.a HAVING COUNT(b.b) = 2

Где x1 и т. Д. - это значения "b", которые я хочу ограничить.

Например, в этом случае

WHERE b.b IN (1,2,3)

вернет "а"

WHERE b.b IN (1,2)

вернет "a" и "b"

и

WHERE b.b IN (2,3) 

вернет только "а"

Я не уверен, почему это работает, но, похоже, это так.

0 голосов
/ 06 мая 2010
SELECT  a
FROM    (
        SELECT 'a' AS a, '1' AS b
        UNION 
        SELECT 'a' AS a, '2' AS b
        UNION
        SELECT 'b' AS a, '1' AS b
        ) AS a
GROUP BY
        a
HAVING  COUNT(*) > 1

Обратите внимание, что используемый вами синтаксис * является расширением MySQL, которое не должно использоваться следующим образом.

a.b в этом случае не будет агрегатом: это будет случайная запись из группы 'a'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...