2013-06-03 30 views
5

Tôi có 4 bảng ACCOUNTS_TABLE, LINKS_TABLE, GROUPS_TABLE, KEYS_TABLE enter image description hereLàm thế nào để viết THAM GIA QUERY cho 4 bảng trong điều kiện dưới đây

enter image description here

enter image description here

enter image description here

tôi cần phải nhận được all accounts details là của acct_type xx với count of Links, groups& keywords. Tôi đã cố gắng truy vấn này, nhưng nó mang lại cho tất cả 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 

sản lượng yêu cầu của tôi nên như thế này enter image description here

Bất kỳ một hãy giúp tôi để slove vấn đề này

Trả lời

1

Có thể bạn nên sử dụng 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

sửa đổi để sử dụng các điều kiện cập nhật tham gia, vv: -

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

Vẫn cho tất cả tính là số – Juice

+0

khi tôi bỏ qua 'GROUP BY acc.acct_id', nó cho tổng số đếm chính xác. Nhưng tôi cần tất cả các tài khoản seperatly! – Juice

+0

Điều dường như dừng lại mang lại dữ liệu hữu ích cùng với dữ liệu thử nghiệm của bạn là bạn đã chỉ định acct_type của 'nhà quảng cáo' trong kết nối vào bảng liên kết. Không có hồ sơ phù hợp cho việc này. Loại bỏ điều này được một số hồ sơ. Ngoài ra, bạn đã chỉ định tham gia bảng khóa bằng cách sử dụng key_id và id bảng liên kết. Bạn có muốn tham gia vào những điều này hoặc trên camp_id mà sẽ có ý nghĩa hơn? – Kickstart

0

Bạn có thể thử một cái gì đó như thế này:

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

Tại sao subquery? –

+1

Các truy vấn phụ có liên quan có liên quan rất đắt. –

+0

@OlivierCoilland: Bạn nói đúng, bạn hoàn toàn có thể làm mà không cần. – 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 

Câu trả lời đã chỉnh sửa để khớp với câu hỏi được cập nhật - điều này sẽ làm những gì bạn đã yêu cầu.

này nên làm những gì bạn đã yêu cầu, SQL fiddle đây - http://www.sqlfiddle.com/#!2/f4b6a/20

+0

Đây là cùng một truy vấn mà tôi đã cung cấp. – Juice

+0

Cập nhật SQL ngay bây giờ –

0

Tôi đã rejigged mã của bạn một chút (xem dưới đây) cho một vài lý do:

  1. Đó là hữu ích (ví tôi anyway) để viết câu lệnh SELECT của tôi luôn theo một cách nào đó - với bất kỳ thứ gì không được nhóm lại trước tiên, và lý tưởng đặt mọi thứ theo thứ tự như THAM GIA của tôi và làm tương tự trong GROUP BY
  2. của tôi. bảng FROM của tôi vào WHERE không JOIN để làm cho nó rõ ràng hơn những gì tôi đang cố gắng làm và Để làm cho nó dễ dàng hơn để sửa đổi sau này.
  3. Tôi cũng muốn đảm bảo nó được đặt ra để giúp bạn dễ dàng hơn trong việc quét tìm sự cố.

Thực hiện truy vấn được sắp xếp lại này và đọc qua để đảm bảo bạn đang nhận được hành vi bạn mong đợi.

PS Tôi không chắc chắn về tên bảng và kiểu báo giá của bạn - tôi thường sử dụng dấu tick (`) và sẽ không bao giờ đặt dấu chấm (.) Trong tên bảng của mình. Nếu bạn đặt chúng ở dạng trình giữ chỗ tốt, nhưng chúng có thể dẫn đến rắc rối cho bạn nếu chúng là thực.

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 Validated: http://www.sqlfiddle.com/#!2/f4b6a/20

+0

Tôi cần để có được tất cả các chi tiết tài khoản với số seperatly. Nó chỉ cho tổng số. tức là, acc1 có 2 liên kết 1 nhóm và 3 từ khóa, acc2 có 3 liên kết 3 nhóm và 1 từ khóa như khôn ngoan – Juice

Các vấn đề liên quan