Mysql SQL将不同大小的表与空值替换连接在一起

Mysql SQL将不同大小的表与空值替换连接在一起,mysql,sql,sql-server,Mysql,Sql,Sql Server,我正在处理一个datatable的查询,但我似乎无法让它显示我想要的方式,我不知道这在SQL中是否可能,我想做的是让查询响应一个布尔类型的额外列 目前,我可以运行两个查询,它们都能很好地工作,但我不知道如何将它们连接在一起。下面是我第一个查询的代码,它的作用是返回啤酒。用户已经尝试过,它工作正常,按预期返回 SELECT * FROM keg.beer JOIN keg.userbeer ON beer.id = userbeer.beer_id WHERE userbeer.use

我正在处理一个datatable的查询,但我似乎无法让它显示我想要的方式,我不知道这在SQL中是否可能,我想做的是让查询响应一个布尔类型的额外列

目前,我可以运行两个查询,它们都能很好地工作,但我不知道如何将它们连接在一起。下面是我第一个查询的代码,它的作用是返回啤酒。用户已经尝试过,它工作正常,按预期返回

SELECT * 
FROM keg.beer 
JOIN keg.userbeer 
  ON beer.id = userbeer.beer_id 
WHERE userbeer.username_id = 1;
第二个查询更简单,只是一个获取啤酒列表的选择

SELECT * FROM keg.beer

我想做的是运行一个查询,让它返回一个带有布尔值的啤酒列表(如果用户尝试过或没有尝试过)。

您不会遇到太多无法使用纯“ol SQL”生成的“期望结果”场景。在本例中,您将使用案例陈述来确定此人是否喝过啤酒。您还需要一个左外部联接,这样当筛选的
userid
没有
userbeer
记录时,就不会删除来自
beer
表的记录:

 SELECT 
     beer.name, 
     beer.id, 
     beer.country,
     CASE WHEN userbeer.username_id IS NULL THEN 0 ELSE 1 END AS user_tried_beer_boolean
 FROM keg.beer 
     LEFT OUTER JOIN keg.userbeer 
       ON beer.id = userbeer.beer_id 
      AND userbeer.username_id = 1;
正如这里的注释中提到的@SeanLange,对userid的WHERE语句的限制将导致删除结果集中需要的记录,因此,我们将
username_id=1
的限制移动到
左侧外部联接的
部分,以便
userbeer
表的结果在加入
beer
表之前仅限于该用户


现在我需要喝一杯。

您不会遇到太多无法用纯“ol SQL”生成的“期望结果”场景。在本例中,您将使用案例陈述来确定此人是否喝过啤酒。您还需要一个左外部联接,这样当筛选的
userid
没有
userbeer
记录时,就不会删除来自
beer
表的记录:

 SELECT 
     beer.name, 
     beer.id, 
     beer.country,
     CASE WHEN userbeer.username_id IS NULL THEN 0 ELSE 1 END AS user_tried_beer_boolean
 FROM keg.beer 
     LEFT OUTER JOIN keg.userbeer 
       ON beer.id = userbeer.beer_id 
      AND userbeer.username_id = 1;
SELECT  b.id,
        b.name,
        CASE WHEN u.username_id IS NOT NULL THEN TRUE ELSE FALSE END AS userdrankbeer
FROM keg.beer b
LEFT JOIN ( SELECT * FROM keg.userbeer WHERE username_id = 1 ) u
  ON beer.id = userbeer.beer_id 
正如这里的注释中提到的@SeanLange,对userid的WHERE语句的限制将导致删除结果集中需要的记录,因此,我们将
username_id=1
的限制移动到
左侧外部联接的
部分,以便
userbeer
表的结果在加入
beer
表之前仅限于该用户

现在我需要喝一杯

SELECT  b.id,
        b.name,
        CASE WHEN u.username_id IS NOT NULL THEN TRUE ELSE FALSE END AS userdrankbeer
FROM keg.beer b
LEFT JOIN ( SELECT * FROM keg.userbeer WHERE username_id = 1 ) u
  ON beer.id = userbeer.beer_id 
)



)

你想要的产出是什么..标准啤酒清单是一个id,名称和国家,加上一个真-假列。@teja可能真的喝醉了:)谢谢所有的帮助,很感激你想要的产出..标准啤酒清单是一个id,名字和国家加上一个真假栏。@teja可能真的喝醉了:)谢谢大家的帮助,我很感激你们在几秒钟内打败了我!必须将userbeer.username\u id=1移动到连接谓词,否则左连接将成为内部连接。:)@事实上你的答案是0.5秒前的Jnevill@SeanLange啊!忘了那部分!我已经更新了答案,将其包括在内。谢谢哈哈,我的意思是添加的是空部分,比我快了几秒钟!必须将userbeer.username\u id=1移动到连接谓词,否则左连接将成为内部连接。:)@事实上你的答案是0.5秒前的Jnevill@SeanLange啊!忘了那部分!我已经更新了答案,将其包括在内。谢谢LOL我的意思是添加is null部分为什么子查询?一个标准的左连接就可以了。为什么要使用子查询?标准的左联接可以正常工作。