2013-06-03 8 views
5

mam 4 tabel ACCOUNTS_TABLE, LINKS_TABLE, GROUPS_TABLE, KEYS_TABLE enter image description hereJak napisać DOŁĄCZ zapytań dla 4 stoły na poniższym warunkiem

enter image description here

enter image description here

enter image description here

muszę get all accounts details która jest z acct_type xx z count of Links, groups& keywords. Próbowałem tej kwerendy, ale daje wszystko count as 0

SELECT 
    acc.acct_id, acc.acct_type, count(link.id) as link_count, link.account, 
    groups.camp_id, count(groups.id) as group_count, count(keyword.key_id) as key_count 

FROM ".ACCOUNTS_TABLE." as acc 
    LEFT JOIN ".LINKS_TABLE." as link ON link.account=acc.acct_id AND acct_type='xx' 
    LEFT JOIN ".GROUPS_TABLE." as groups ON groups.camp_id=link.id 
    LEFT JOIN ".KEYS_TABLE." as keyword ON keyword.camp_id=link.id 

GROUP BY acc.acct_id 

Moja wymagane wyjście powinno być jak ten enter image description here

Każdy proszę mi pomóc slove ten problem

Odpowiedz

1

Prawdopodobnie powinieneś używać COUNT (DISTINCT ....).

SELECT acc.acct_id, COUNT(DISTINCT link.id), COUNT(DISTINCT groups.id), COUNT(DISTINCT keyword.key_id) 
FROM ACCOUNTS_TABLE acc 
LEFT OUTER JOIN LINKS_TABLE link ON link.account = acc.acct_id AND acct_type = 'advertiser' 
LEFT OUTER JOIN GROUPS_TABLE groups ON groups.camp_id = link.id 
LEFT JOIN KEYS_TABLE keyword ON keyword.id = link.id 
WHERE acc.acct_type = 'xx' 
GROUP BY acc.acct_id 

EDIT

Zmieniony używać zaktualizowanych warunków przyłączenia, etc: -

SELECT acc.acct_id, acc.acct_type, COUNT(DISTINCT link.id) , COUNT(DISTINCT groups.id) , COUNT(DISTINCT keyword.key_id) 
FROM ACCOUNTS_TABLE acc 
LEFT OUTER JOIN LINKS_TABLE link ON link.account = acc.acct_id 
LEFT OUTER JOIN GROUPS_TABLE groups ON groups.camp_id = link.id 
LEFT JOIN KEYS_TABLE keyword ON keyword.camp_id=link.id 
WHERE acc.acct_type = 'xx' 
GROUP BY acc.acct_id, acc.acct_type 
+0

Nadal podając wszystkie liczą jako zero – Juice

+0

kiedy pomijam "GROUP BY acc.acct_id", to daje on całkowitą liczbę poprawnie. Ale potrzebuję połączyć wszystkie konta oddzielnie! – Juice

+0

To, co wydaje się zatrzymywać to przynoszące z powrotem użyteczne dane z twoimi danymi testowymi, to że określiłeś acct_type "reklamodawcy" w złączeniu na tabeli linków. Nie ma pasujących rekordów dla tego. Usunięcie tego spowoduje pobranie niektórych rekordów. Określono również, że należy dołączyć do tabeli kluczy, używając identyfikatora key_id i id tabel łączy. Czy chcesz dołączyć do nich na tych lub na camp_id, które miałyby więcej sensu? – Kickstart

0

Można spróbować czegoś takiego:

SELECT ACC.Id 
     ,(SELECT COUNT (*) FROM Links L WHERE L.AccountId = ACC.Id) AS CountOfLinks 
     ,(SELECT COUNT (*) FROM Groups G WHERE G.AccountId = ACC.Id) AS CountOfGroups 
FROM (SELECT Id FROM Accounts Acc WHERE Acc.Type = 'some type') ACC 
+0

Dlaczego podkwerendę? –

+1

Co powiązane zapytania dodatkowe są BARDZO drogie. –

+0

@OlivierCoilland: Masz rację, bez problemu mógłbyś to zrobić. – souplex

0
SELECT 
    accounts_table.acct_id, 
    accounts_table.acct_type, 
    COUNT(DISTINCT links_table.id) AS link_count, 
    COUNT(DISTINCT groups_table.id) AS group_count, 
    COUNT(DISTINCT keys_table.key_id) AS key_count 
FROM 
    accounts_table 
LEFT JOIN 
    links_table 
    ON links_table.account = accounts_table.acct_id 
LEFT JOIN 
    groups_table 
    ON groups_table.camp_id = links_table.id 
LEFT JOIN 
    keys_table 
    ON keys_table.camp_id = links_table.id 
WHERE 
    acct_type = 'xx' 
GROUP BY 
    accounts_table.acct_id, 
    accounts_table.acct_type 
ORDER BY 
    link_count DESC, 
    group_count DESC, 
    key_count DESC 

Edytowano odpowiedź pasującą do zaktualizowanego pytania - powinno to zrobić to, o co prosiłeś.

Należy to zrobić co pan poprosił, SQL skrzypce tutaj - http://www.sqlfiddle.com/#!2/f4b6a/20

+0

To jest to samo zapytanie, które podałem. – Juice

+0

Zaktualizowany SQL teraz –

0

Mam rejigged kod nieco (patrz niżej) z kilku powodów:

  1. Jest to pomocne (dla w każdym razie) do napisania moich instrukcji SELECT zawsze w określony sposób - wszystko, co nie jest zgrupowane umieszczone jako pierwsze, i idealnie umieszczanie rzeczy w tej samej kolejności co moje JOINy ​​i robienie tego samego w mojej grupie przez
  2. umieszczam wszystko, co ogranicza my FROM table do WHERE not the JOIN, aby uczynić jaśniejszym, co próbuję zrobić i lso, aby ułatwić późniejszą modyfikację.
  3. Chciałbym również zapewnić, że jest dobrze rozplanowany, aby ułatwić skanowanie w poszukiwaniu problemów.

Weź to zmienione zapytanie i przeczytaj je, aby upewnić się, że otrzymujesz oczekiwane zachowanie.

PS Nie jestem pewien co do nazw twoich tabel i stylu cytowania - zwykle używam tyknięć (`) i nigdy nie umieszczam kropek (.) W nazwach moich tabel. Jeśli umieścisz je jako elementy zastępcze, które są w porządku, ale mogą spowodować kłopoty, jeśli są prawdziwe.

SELECT 
acc.acct_id, 
-- if you don't group by these then you need to remove them as they will just return the first values based on mysql behaviour 
acc.acct_type, 
link.account, 
groups.camp_id, 
-- these counts will only count where an ID is present which seems like what you're after 
count(link.id) as link_count, 
count(groups.id) as group_count, 
count(keyword.key_id) as key_count 
FROM ".ACCOUNTS_TABLE." as acc 
LEFT JOIN ".LINKS_TABLE." as link ON link.account=acc.acct_id 

LEFT JOIN ".GROUPS_TABLE." as groups ON groups.camp_id=link.id 
LEFT JOIN ".KEYS_TABLE." as keyword ON keyword.id=link.id 

WHERE acct_type='advertiser' 

GROUP BY acc.acct_id, 
-- only use these if you intend to group by them 
acc.acct_type, 
link.account, 
groups.camp_id DESC 
0
SELECT acct_type, 
     count(acct_type), 
     count(l.id), 
     count(g.id), 
     count(key_id) 
FROM accounts a 
LEFT JOIN links l ON (l.account = a.acct_id) 
LEFT JOIN groups g ON (g.camp_id = l.id) 
LEFT JOIN keysTable k ON k.group_id = g.id 
GROUP BY acct_type HAVING acct_type = 'xx'; 

SQL Fiddle ZWERYFIKOWANYCH: http://www.sqlfiddle.com/#!2/f4b6a/20

+0

Muszę uzyskać wszystkie szczegóły konta zliczeń seperatly. To po prostu daje całkowitą liczbę. tj. acc1 ma 2 linki 1 grupa i 3 słowa kluczowe, acc2 ma 3 linki 3 grupy i 1 słowo kluczowe jak mądry – Juice