2013-03-13 78 views
-3

三表需要優化查詢其需要的數據,從三個表

accounts, products, users 
  1. 選擇用戶ID和電子郵件從用戶表那裏ID在 佔
  2. 然後從產品表,其中篩選出來用戶 買了3件以上的商品 (需要統計產品表中的用戶數量,如果用戶數量超過3,則排除用戶)。

    SELECT id, email 
    FROM users 
    WHERE id 
    IN (
    SELECT user_id 
    FROM accounts 
    WHERE users.id = user_id 
    ) 
    

我把所有的用戶ID和電子郵件,但現在我需要將它們從產品表中過濾掉。在產品表中,我有'product_id'和'leader_id',這是用戶ID。

我需要優化的查詢,因爲表非常大

+1

沒有足夠的信息。我們不知道這些表格是如何相關的。我們不知道表中是否存在任何索引來提高性能,我們不知道您嘗試了什麼。 – xQbert 2013-03-13 12:23:58

+0

確實....向我們展示了一些示例數據或您的表格結構;) – Hackerman 2013-03-13 12:25:00

+1

@javier這是一個非常大的飛躍。假設每個表都有一個名爲ID的字段,我推斷它的意思是它們的主鍵,可能是Account_ID,Product_ID,User_ID或可能只是'ID',這個含糊性就是我問的原因。 – xQbert 2013-03-13 12:28:06

回答

1

我有點明白了......這樣的事情應該工作:

select u.id,u.mail, 
(select count(1) 
    from products 
    where products.leader_id = u.id) 
as conteo 
from user u 
    left join account ac 
on(u.id = ac.user_id) 
having (conteo>3) 

我希望它能幫助;)

Saludos。

1

如果您需要一個優化的查詢,請提供適當的架構細節 - 表,數據類型和索引。

SELECT id, email 
    FROM users 
    WHERE id 
    IN (
     SELECT user_id 
     FROM accounts 
     WHERE users.id = user_id 
    ) 

絕對不要使用子查詢,除非你絕對必須。既然你不想要帳戶表中的任何數據,在大多數數據庫管理系統中,'EXISTS(SELECT 1 FROM accounts WHERE users.id = user_id)'的效率會更高 - 但在MySQL中不會優化很好地推動謂詞。

查詢應該是:

SELECT DISTINCT u.id, u.email 
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id; 
從產品表,其中用戶購買了超過3個產品

雖然我可以猜到足夠的架構的重新編寫之前的查詢

出來,我不知道產品表是如何構建的,事實上,'產品'暗示着一個項目的目錄,並且與帳戶的關係似乎是一個n:m,這意味着必須有一個分解關係的缺失表。此外,根據您的描述,賬戶數據與「產品」表格數據無關(似乎很奇怪)。你想包括用戶在「產品」中沒有相關記錄的情況嗎?

假設這是不是這種情況,並且在猜測什麼結構可能....

SELECT u.id, u.email, SUM(IF(leader_id IS NULL, 0, amount)) 
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id 
LEFT JOIN product p 
ON u.id=p.leader_id 
GROUP BY u.id, u.email; 

我需要優化的查詢,因爲表非常大

爲什麼你需要在單個查詢中查看所有數據嗎?

+0

好的查詢,但用戶不排除那些購買超過3倍。 id列在leader_id列中的產品中。我需要排除購買產品超過3次的所有用戶 – Akaash 2013-03-13 13:17:30

+0

哎呀 - 在故事中有點失落 - 在末尾添加'HAVING SUM(IF(leader_id IS NULL,0,amount))<4'。 – symcbean 2013-03-13 13:33:03