2014-10-31 26 views
1

我有這個查詢哪些工作正常。使用連接的替代語法

我所需要的行,其中所述子類別屬於公司

OR

公司擁有訪問默認子類別(c.plannerdefaults = 1)和子類別是默認子類別(s.company = 0)

SELECT distinct 
     s.category from planner_subcat s, company c 
      where 
       (
       c.id = 66 
       and c.plannerdefaults = 1 
       and s.company = 0 
       ) 
       or s.company = 66 

的事情是,也許我的想法是錯在這裏,我得到的印象是,如果查詢與

select col from table1, table2 
0123開始

那麼方法有問題,但在這種情況下,我想不出使用連接的替代方案。

有沒有?

+0

你是什麼意思「有什麼問題的方法」?你的意思是在性能方面? – enigma 2014-10-31 17:01:40

+0

我沒有看到任何問題及其邏輯。你可以嘗試使用存在的邏輯來減少鎖定 – Jaylen 2014-10-31 17:02:50

+0

你使用的邏輯看起來很好。你可以使用顯式的「OUTER JOIN」替換隱式的外連接(你的逗號)。用INNER JOIN構建這個可能會非常難看。可以對同一個表進行多次命中,也可以在兩次選擇之間使用UNION,其中一個使用INNER JOIN,另一個使用OUTER。 – JNevill 2014-10-31 17:05:14

回答

1

我會寫的查詢是這樣的:

SELECT s.category 
FROM company c 
JOIN planner_subcat s 
    ON c.id = s.company OR (c.plannerdefaults = 1 AND s.company = 0) 
WHERE c.id = 66; 
+0

這就是我一直在尋找的!我沒有談及使用條件的'ON'子句 – andrew 2014-10-31 17:15:35

1

我不確定你的目標是什麼。

爲什麼要重新編寫查詢,您是否看到性能問題?

如果您正在尋找替代語法。

這是使用子查詢的一種語法。這個查詢可能會更快一些,如果表格很大(不確定是否需要測試它),它也會減少行鎖定,也可以確定這個關係1計劃對多公司,那麼除非需要DISTINCT函數,否則這是一個不同的關係,然後將其添加回

SELECT s.category 
FROM planner_subcat AS s 
WHERE s.company IN(66,0) AND (
s.company = 66 OR EXISTS (SELECT 1 FROM company AS c WHERE id = 66 AND plannerdefaults = 1 AND s.company = 0 AND company = s.company) 
) 

,如果你只是想查詢有一個較新的語法只那就試試這個

SELECT DISTINCT s.category 
FROM planner_subcat AS s 
INNER JOIN company AS c ON c.company = s.company 
WHERE s.company IN(0,66) AND (s.company = 66 OR (c.id = 66 AND c.plannerdefaults = 1 AND s.company = 0)) 

但我認爲我的第一個查詢將是你的情況更好因爲你不需要再使用DISTINCT。我會認爲MySQL不會每次執行子查詢,除非company = 0,因爲company = 66條件將滿足條件,那麼沒有理由做更多的檢查。

+0

從你的答案聽起來像原來是好的?如果你看到我的評論謎以上可能會使問題的原因更清楚。我會給你的建議嘗試 – andrew 2014-10-31 17:13:49

+0

這很好,謝謝,但+1 – andrew 2014-10-31 17:20:46

+0

好吧。我建議你使用我的第一個查詢,因爲我在我的回答中提到的原因 – Jaylen 2014-10-31 17:22:23