2012-03-08 117 views
0

我想選擇在哪裏零結果

1)list.ispublic = 1
2)userlist.userid='aaa'userlist.listid=list.listid

我需要1)+2行)Sql語句返回

有一排已經但這個聲明不能得到那一行,有沒有問題?

名單表:

ListID ListName Creator IsRemindSub IsRemindUnSub IsPublic CreateDate LastModified Reminder 
1  test2  aaa  0   0    1   2012-03-09 NULL   NULL 

USER_LIST表(沒有行):

UserID ListID UserRights 

我的測試版本

SELECT * 
FROM list l 
INNER JOIN user_list ul ON ul.ListID = l.ListID 
WHERE l.IsPublic = 1 AND ul.UserID = '09185346d' 

這是結果的時候有兩個列表USER_LIST有aaa,並且一個列表在列表中是公共的,所以如果我在ph中得到它,這將導致在列表中雙重檢索那個公共列表p?

ListID ListName Creator IsRemindSub IsRemindUnSub IsPublic CreateDate LastModified Reminder UserID ListID UserRights 
1   test2  aaa  0    0    1   2012-03-09 NULL      aaa  1   read 
2   t2   aaa  0    0    1   2012-03-09 NULL      aaa  2   read 
+0

隱式(Oracle樣式)連接是「內部」連接。 – 2012-03-08 18:28:34

回答

0

首先,儘量只SELECT你實際上需要的領域。其次,明確地寫下你的JOINS - 它有助於可讀性。例如:

SELECT l.*, ul.* 
FROM list l 
INNER JOIN user_list ul ON ul.ListID = l.ListID 
WHERE l.IsPublic = 1 
    AND ul.UserID = 'aaa' 

順便說一下,如果你在你user_list表中沒有數據,那麼你就沒有辦法滿足你的要求。如果如你所說的那樣,「userlist.listid = list.listid」是必要的且user_list表是空的,你將總是得到零行返回。

編輯:將雙檢索沒有,也不會造成行。無論您使用SQL查詢得到的結果是否與您在PHP腳本中獲得的結果相同 - 檢索數據的機制都是相同的。

+0

查看更新版本。謝謝。 – user782104 2012-03-08 18:44:00

+0

@ user782104:我更新了我的答案。如果您要向最初的問題添加更多數據,請不要將製表符複製/粘貼到問題中,因爲它無法正確顯示。 – Crontab 2012-03-08 18:56:57

1

如果您的user_list表不包含任何行,那麼該查詢將不會返回任何結果。

你想要一個左連接。

SELECT list.col_1, list.col_2 -- etc... 
FROM list 
LEFT JOIN user_list ON user_list.ListID = List.ListID 
WHERE list.IsPublic = 1 
    OR user_list.UserID = 'aaa' 
+0

哦,另一部分是否正確? – user782104 2012-03-08 18:24:38

+0

他希望根據上面的規範使用'INNER JOIN':「userlist.userid ='aaa'AND userlist.listid = list.listid」。列表ID必須匹配的事實表明內部聯接。 – Crontab 2012-03-08 18:29:36

+0

我認爲這個問題是有缺陷的。 :) – 2012-03-08 18:36:36