2012-05-29 67 views
0

我有一個問題。mysql query顯示9個結果

我正在運行以下查詢。我的數據庫中只有一條記錄,但我得到了9條結果。

SELECT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46) 
    AND cv_cat.cvFK = c.id 

有人能讓我知道他們是否有任何問題,這個查詢。爲什麼我得到9個結果而不是1個結果。

此查詢只應顯示一條記錄,但其中顯示9條結果。

+0

爲什麼不能像正常人一樣寫'JOIN'查詢呢? –

回答

2

當你

FROM cv AS c, employee AS e , cvCat AS cv_cat 

你正在做的三個表的隱式連接。如果你想獲得不同的記錄,你可以在您的選擇添加DISTINCT

SELECT DISTINCT c.id, c.rk 
FROM cv AS c, employee AS e , cvCat AS cv_cat 
WHERE c.status=1 
    AND c.empIDFK = e.id 
    AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46) 
    AND cv_cat.cvFK = c.id 
+0

這會使查詢變慢 – Lalajee

+0

它不應該讓你的查詢花費比現在多得多的時間。如果您正在選擇的「DISTINCT」列被索引,那麼mySQL將能夠使用該索引返回不同的記錄。如果列未被索引,那麼mySQL將創建一個臨時表來計算不同的記錄。如果以「EXPLAIN」爲前綴查詢,則可以檢查最後一列標記爲「Extra」的列,它會告訴您它是使用索引還是臨時表來返回不同的結果。 –

+0

我將索引編號。它是我的主要關鍵。 – Lalajee

2

使用明確連接:

SELECT c.id, c.rk 
FROM cv c 
INNER JOIN employee e ON e.id = c.empIDFK 
INNER JOIN cvCat cv_cat ON cv_cat.cvFK = c.id 
WHERE c.status = 1 
AND cv_cat.categoryFK IN (17,18,19,38,39,40,41,44,45,46) 
+0

這會減緩我的查詢下降 – Lalajee

+0

仍然顯示我做出chnages 9結果。 – Lalajee

+0

@Lalajee你需要遵循zi42的建議,並在你的SELECT之後加上關鍵字'DISTINCT'(如果是這樣的話)。如果之前的結果是9行完全相同的數據,那麼添加'DISTINCT'將只輸出一行。如果不知道表格中的數據或確切的輸出結果,可以給出的建議數量是有限的。至於速度,使用顯式連接實際上應該比其他任何事情都快。 – Crontab

1

我覺得9結果行「的問題」是基於你的JOIN語法,這種隱式連接將返回所有行(每個表)作爲一個連接結果,因爲你只是拉出c.id和c.rk它可能看起來像MySQL發回相同的結果回9次。

邊注:隱式連接是被棄用,使用顯式聯接,如...

SELECT c.id, c.rk 
    FROM cv c 
    LEFT JOIN employee e ON c.empIDFK = e.id 
    LEFT JOIN cvCat cv_cat ON c.id = cv_cat.cvFK 
    WHERE... 

將幫助「面向未來」的代碼了一下,增加一點自我描述的語法整個查詢。

+0

左或內連接有什麼不同。 – Lalajee

+0

仍然顯示9結果 – Lalajee