【问题标题】: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 title
1 A
2 B
3 C

儿童

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
    

    【讨论】:

    • OP 希望父母的行与孩子一起加入。不仅仅是父母。
    【解决方案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
                       );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-03
        • 2021-04-04
        • 2018-11-16
        • 2014-08-28
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多