2012-02-10 106 views
1

我有以下示例查詢(MySQL的):SQL - 我應該使用連接嗎?

SELECT * FROM `action` 
WHERE `customer_id` IN 
    (SELECT `id` FROM `customer` WHERE `status`=1) 
ORDER BY 
    action.date ASC 
LIMIT 0, 10 

我需要能夠爲了通過customer.status領域。我是否通過連接完成此操作?

statuscustomer表中的字段。


編輯查詢:

SELECT * FROM `action` 
ORDER BY 
    action.date ASC 
LIMIT 0, 10 

重要!

我解析通過PHP返回的數據。運行修改後的查詢後:

SELECT * FROM `action` a INNER JOIN `customer` c ON a.customer_id = c.id ORDER BY a.form_id ASC LIMIT 0, 10 

我的PHP代碼打破...


This post幫了我。

我修改後的查詢看起來是這樣的:

SELECT 
    *, a.id AS lead_id, c.id AS customer_id 
FROM 
    `action` a 
INNER JOIN 
    `customer` c ON a.customer_id = c.id 
ORDER BY c.status DESC 

謝謝大家!


UPDATE

因爲我有一些客戶記錄沒有動作記錄,內部聯接未返回所有相關記錄。我現在使用JOIN,所有結果都按預期返回。

+0

這是一個過濾器的狀態,所以我將需要編輯示例 – AVProgrammer 2012-02-10 20:08:04

回答

5
SELECT * 
FROM `action` a 
INNER JOIN `customer` c on a.`customer_id` = c.`id` 
WHERE c.`status` in (1, 4, 7, 8) 
ORDER BY a.date, c.status 
LIMIT 0, 10 
+0

都打敗我吧。這將是去AVP的方式,儘管從您想要由c命令的問題的聲音。狀態第一 – 2012-02-10 19:14:37

+2

我不是mySql的專家,但我很好奇,如果ORDER BY子句中有'c.status'的原因。 – 2012-02-10 19:16:09

+0

如果你只想從動作表中得到結果,你可以選擇a。*,並且你可以在查詢結尾添加一個GROUP BY a.id – 2012-02-10 19:16:11

2

是的,你可以用一個連接完成它,可能會更快:

SELECT * FROM `action` a join customer c on c.id=a.customer_id 
where c.status=1 
ORDER BY 
    a.date ASC 
LIMIT 0, 10 

另外,考慮不使用*,而是列出你所需要的列。如果您需要選擇少於所有列,那麼它將提高性能,並且如果表格發生變化,您將來也不會感到意外。

+0

您忘記了客戶狀態的附加訂單 – 2012-02-10 19:17:06

+0

@Paul謝謝,更正! – Icarus 2012-02-10 19:19:21

+0

to @MikeChristensen的觀點,你保證在查詢的where子句中狀態總是1,這使得對它的排序不必要... – 2012-02-10 19:45:44

2

您可以執行:

SELECT * FROM `action` a 
INNER JOIN `customer` c on c.id = a.customer_id 
WHERE c.status = 1 
ORDER BY a.date ASC, c.status 
LIMIT 0, 10 

或者:

SELECT * FROM `action` a 
INNER JOIN `customer` c on (c.id = a.customer_id and c.status = 1) 
ORDER BY a.date ASC, c.status 
LIMIT 0, 10 

編輯:

這也許值得指出的有訂貨沒有意義的c.status,因爲它總是是1。但是,我把它放在那裏,因爲它是由其他人提出的,也是在OP中提到的。我認爲它可以從兩個查詢中刪除。

+0

你忘記了客戶狀態的附加訂單 – 2012-02-10 19:17:22

+0

@Paul - 不是狀態該查詢中始終爲1? – 2012-02-10 19:19:22

1
SELECT * FROM `action` a 
JOIN `customer` c on a.customer_id=c.id 
WHERE c.status=1 order by a.date, c.status ASC 
LIMIT 0, 10