MySQL:选择用户是否在另一个表中
请记住,语句和表格都有更多内容,但为了便于阅读,我会尽量简短 我想知道用户是否在商店里。这些桌子看起来像这样MySQL:选择用户是否在另一个表中,mysql,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 此代码的问题在于,对于非User
--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
此代码的问题在于,对于非UserID 1的访问,它不会显示NULL。我试图将或UserID为NULL
添加到语句中,但它只留下了所有未被任何用户访问过的商店
我可以通过检查访问的是否与UserID相同来过滤它,但如果数据库可以将其写入1和0,则会容易得多。因此,要问具体问题:
如何根据访问表中是否有与ShopID连接的用户ID 1,将访问的输出为0或1?您正试图实现这一点,我认为:
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 )
SELECT s.ShopID, v.UserID AS Visited
FROM shop s LEFT OUTER JOIN
visit v
ON s.ShopID = v.ShopID AND v.UserID = 1;
您需要将条件置于on
子句中的v
,而不是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;
加入的问题是,您将所有“shopID”保留在列表中,因为您只需创建一个列表,该列表将扩展所有店铺
s和访问
s以及未访问过的店铺
s。如果我没弄错,您想要的是用户=1
访问的商店。只需使用Visit
表即可轻松实现这一点
Select DISTINCT visit.shopID FROM visit
WHERE UserID = 1
是追求简单性和性能的途径。但是,也许您想要更像这样的东西,来检查给定用户是否访问过每家店铺:
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
子句,并按任何字段筛选店铺列表。请提供示例数据和所需结果。因此,您只想加入有人访问过的店铺?也就是说,如果有一家商店没有人去过,你希望它被排除在结果之外?你到底想要什么?某个特定用户去过的所有商店的列表?似乎您想要一个正确的连接,或者,更好的是,简单地反转表WHERE将使if始终为false其中UserID=1或UserID为NULL
这是一个。显示所有店铺,而不考虑访问情况,并显示User 1
是否已进入每个店铺。