【问题标题】:How to return rows from left table where condition on right table true on all row without sub query如何从左表返回行,其中右表的条件在没有子查询的所有行上为真
【发布时间】:2021-09-09 09:56:52
【问题描述】:
我有 2 个包含此示例数据的表。
父母
儿童
| id |
p_id |
number |
| 1 |
1 |
1 |
| 2 |
1 |
2 |
| 3 |
1 |
3 |
| 4 |
2 |
4 |
| 5 |
2 |
5 |
| 6 |
2 |
6 |
| 7 |
3 |
2 |
| 8 |
3 |
7 |
| 9 |
3 |
8 |
| 10 |
3 |
9 |
我想从父母那里得到行,加入孩子和数字 > 3。
但我只想接收所有孩子的条件都正确的父母,即使一个孩子的条件不正确,也不应该返回父母
我想不用子查询
SELECT * FROM `parent`
LEFT JOIN `childs` on `childs`.`p_id` = `parent`.`id`
WHERE `childs`.`number` > '3'
我只想得到符合这种条件的父母 B。
谢谢。
【问题讨论】:
标签:
mysql
sql
database
phpmyadmin
【解决方案1】:
也许这样的东西可以工作
SELECT *
FROM parent p, child c2
WHERE EXISTS ( SELECT *
FROM child c1
WHERE p.id = c1.p_id AND c1.number >3) AND p.id = c2.p_id AND c2.number <=3
【解决方案2】:
试试这个:
SELECT p.id, p.title, GROUP_CONCAT(number ORDER BY number) val
FROM Parent p JOIN Childs c ON p.id=c.p_id
GROUP BY p.id, p.title
HAVING SUBSTRING_INDEX(val,',',1) > 3;
这是fiddle demo
【解决方案3】:
我想从父母那里得到行,加入孩子和数字 > 3。
但我只想接收所有孩子的条件都正确的父母,即使一个孩子的条件不正确,也不应该返回父母
我会推荐:
SELECT p.id, p.title
FROM Parent p JOIN
Childs c
ON p.id = c.p_id
GROUP BY p.id, p.title
HAVING MIN(number) > 3;
根本没有理由将字符串用于您想做的事情。它只是混淆了逻辑。
更有效的方法是使用NOT EXISTS:
select p.*
from p
where not exists (select 1
from childs c
where p.id = c.p_id and c.number <= 3
);