2012-02-16 5 views
1

данной таблицы «х»:Количество MySQL из отдельных записей после матча

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

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

Пример выше одного: Для типа 2, граф будет 4, то есть граф (А, В, С, 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) 

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

Сообщите мне, если есть какой-либо способ, которым я мог бы это сделать.

Спасибо!

+0

Все «COUNT» и другие агрегаты нуждаются в «GROUP BY» в стандартном SQL. – Borealid

ответ

0

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

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

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

+0

Спасибо большое .. Это было полезно. Я подумаю о предложенном вами варианте нормализации. – user1214208

1
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 

Внутренний запрос союз преобразует две отдельные колонки в одну колонку, то внешний запрос принимает, что union'd результат и подсчитывает отдельные значения, сгруппированные по типу.

+0

+1 Разве второй не должен отличаться от x, а не y? –

+0

Woops, справа. благодаря! –

0

попробовать это:

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 
Смежные вопросы