MySQL количество различных записей после матча - PullRequest
1 голос
/ 16 февраля 2012

Данная таблица 'x':

Source  Dest    Type
A       B       2
A       D       2
B       C       2

Теперь я хочу, чтобы общее количество источников и получателей удаляло совпадающие ..

Пример вышеупомянутого: для типа 2 счет будет 4, то есть счет (A, B, C, D)

Я пробовал это:

select Count(distinct Source), Count(distinct destination),Count(distinct source)+Count( distinct destination),Type
from X
where Type=2 and Src NOT IN (select destination
    from  X
    where Type=2)

Мне нужно упростить этот запрос для всех типов.

Дайте мне знать, если я смогу это сделать.

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 февраля 2012
SELECT COUNT(DISTINCT a), Type
FROM (
   SELECT DISTINCT Source AS a, Type
   FROM x

   UNION ALL

   SELECT DISTINCT Dest AS a, Type
   FROM x
)
GROUP By Type

Внутренний запрос на объединение преобразует ваши два отдельных столбца в один столбец, а затем внешний запрос принимает полученный результат объединения и считает отдельные значения, сгруппированные по типу.

0 голосов
/ 16 февраля 2012

Неэффективным методом было бы сделать следующее

SELECT 
  distinctMatches.type AS type,
  COUNT(DISTINCT distinctMatches.name) AS quantity
FROM
(
  (
    SELECT DISTINCT
      type,
      source AS name
     FROM x
  )
  UNION DISTINCT
  (
    SELECT DISTINCT
      type,
      destination AS name
     FROM x
  )
) AS distinctMatches
GROUP BY distinctMatches.type

Это даст в вашем примере данные 1 строку с типом 2 и количеством 4

В идеальном мире я бы посмотрел на структуру базы данных так, как будто бы она должна быть разбита на несколько таблиц, то есть одну для источников (как вы, кажется, группируете «источник» и «пункт назначения», что указывает на то, что они эффективно тот же пункт). Если вам удастся нормализовать дизайн, этот тип запроса будет проще выполнять более эффективно

0 голосов
/ 16 февраля 2012

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

SELECT COUNT(xxx.a) as TotalCount
FROM
    (SELECT source a, type FROM tableX
        UNION
    SELECT dest a, type FROM tableX) xxx
WHERE xxx.Type = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...