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
是否已进入每个店铺。