mysql - MySQL:加入一个表,其中多行是条件的一部分
问题描述
尝试从有多个相关行的连接表中选择一些行。
这是原始查询的一个非常简化的版本,因此请不要对一般表结构提出建议。
表 A
id, title
------------
1, housea
2, houseb
3, housec
4, housed
表 B
id, cid, attrib, val
--------------------
1, 1, bathrooms, 2
2, 1, bedrooms, 1
3, 2, bathrooms, 0
4, 1, pools, 1
5, 2, bedrooms, 1
6, 2, pools, 1
7, 3, bathrooms, 1
8, 4, bathrooms, 1
9, 4, bedrooms, 1
选择所有至少有一间浴室和一间卧室的对象。
所以结果只有这两个应该出现:
2, housea
4, housed
这不起作用:
SELECT a.id, title
FROM tablea a
LEFT JOIN tableb b ON b.cid = a.id
WHERE (b.attrib = "bathrooms" AND b.val > 0) AND (b.attrib = "bedrooms" AND b.val > 0)
这也不是:
SELECT a.id, title
FROM tablea a
LEFT JOIN tableb b1 ON b1.cid = a.id AND (b1.attrib = "bathrooms" AND b1.val > 0)
LEFT JOIN tableb b2 ON b2.cid = a.id AND (b2.attrib = "bedrooms" AND b2.val > 0)
感谢您的建议!
解决方案
你的第二个版本基本上是正确的,除了你想要内部连接:
SELECT a.id, a.title
FROM tablea a JOIN
tableb b1
ON b1.cid = a.id AND (b1.attrib = 'bathrooms' AND b1.val > 0) JOIN
tableb b2
ON b2.cid = a.id AND (b2.attrib = 'bedrooms' AND b2.val > 0) ;
您的所有过滤都在ON
子句中,因此实际上没有过滤掉任何行。如果您查看来自b1
或的列,您会看到过滤b2
。
推荐阅读
- reactjs - 输入 React props 返回错误
- kubernetes - 在 AKS 中用入口替换 haproxy
- python - 使用curl时如何在ubuntu 20.04中解决“无法获取本地颁发者证书(_ssl.c:1123)”?
- c# - Unity C# IOS 滑动检测
- events - Google 活动中的 Zoom 会议地址
- reactjs - useRef TypeScript - 不可分配给类型 LegacyRef
- git - 多平台 git 策略是怎样的?
- haskell - Haskell - 将 [char] 拆分为字符串的函数
- php - 用于在 Safari 中下载多个文件时出现错误的 PHP 表单:加载资源失败:帧加载中断
- javascript - 更新:/login 路由引发错误,我找不到原因