2015-08-23 17 views
1

請記住,語句和表格都有更多的內容,但爲了便於閱讀,我會盡量縮短它。MySQL:選擇用戶是否在另一個表中

我試圖弄清楚用戶是否已經在商店或沒有。表格看起來像這樣。

--Shop-- 
ShopID 

--Visit-- 
ShopID 
UserID 

以下是我目前走過的距離。

SELECT shop.ShopID, visit.UserID AS Visited FROM shop 
LEFT OUTER JOIN visit ON shop.ShopID = visit.ShopID 
WHERE UserID = 1 

這段代碼的問題是,它不會顯示爲參觀,這不是用戶名1.我已經嘗試添加OR UserID IS NULL的聲明NULL,但它只是讓我與尚未所有商店任何用戶訪問過。

我可以通過檢查Visited是否是一樣的用戶名或不過濾,但它會是一個容易得多,如果該數據庫可以寫爲1和0。因此,要提出具體的:

怎麼辦如果在訪問表中有一個用戶ID 1與ShopID連接,則我根據Visited輸出0或1?

+0

請提供樣品數據和所需的結果。 –

+0

所以你只想加入被某人探訪過的商店?也就是說,如果有沒有人去過的商店,你希望它被排除在結果之外? – trex005

+0

你究竟想要什麼?一個特定用戶去過的所有商店的列表? – bpeikes

回答

1

Dennis Klopfer's answer是簡單和性能的方法。但也許你想要的東西更像是,檢查一個給定的用戶不斷訪問的每個店鋪:

shop | visited by user 1 
#1 |  false 
#2 |  true 

如果是這樣的話,我會嘗試這樣的事:

SELECT s.ShopID, IF(ISNULL(v.UserID), FALSE, TRUE) AS visited 
    FROM shop S LEFT JOIN visit v ON s.ShopID = v.ShopID AND v.UserID = 1 

中當然,您還可以將WHERE子句添加到您的查詢中,並按任意字段過濾店鋪列表。

+0

這是一個。顯示所有店鋪,不論訪問情況如何,並顯示每個商店是否有用戶1。 – Phil

0
SELECT shop.ShopID, if(visit.UserID is null,0,1) AS Visited FROM shop 
LEFT OUTER JOIN visit ON (shop.ShopID = visit.ShopID 
AND visit.UserID = 1) 
+1

WHERE會讓if總是假的。 'WHERE UserID = 1或UserID IS NULL' – trex005

+0

@ trex005:謝謝:) – seahawk

0

您正在試圖做到這一點,我認爲:

SELECT s.ShopID, v.UserID AS Visited 
FROM shop s LEFT OUTER JOIN 
    visit v 
    ON s.ShopID = v.ShopID AND v.UserID = 1; 

你需要把條件對vON條款,而不是WHERE子句。

但是,如果用戶可以多次訪問,那麼您將獲得多行。所以,我會建議使用在SELECT子查詢得到一個任意行與用戶:

select s.ShopId, 
     (select v.UserId 
     from visit v 
     where s.SHopId = v.ShopId and v.userId = 1 
     limit 1 
     ) as UserId 
from shop s; 
1

的問題與您一起爲您保留所有的「shopID在列表中,您只需創建一個列表它將所有shop s和visit s擴展爲尚未訪問過的shop。如果我找到你想要的是user = 1訪問shop。只需使用Visit表即可輕鬆實現。

Select DISTINCT visit.shopID FROM visit 
WHERE UserID = 1 
相關問題