【问题标题】:MySQL INNER JOIN with results of WHERE conditions?MySQL INNER JOIN 与 WHERE 条件的结果?
【发布时间】:2013-04-26 23:07:22
【问题描述】:

我希望能够查询 MySQL 数据库,以仅根据父母和孩子查找一个人的兄弟姐妹。我们在这里假设一个人的父母的孩子,一个人的孩子的父母是那个人的兄弟姐妹。

人

id  name
-----------
1   jonny
2   tom
3   sally
4   bill
5   katie
6   jessica

rels

id  parent  child
--------------------
1   2       3
2   5       6
3   2       1
4   1       6
5   1       4
6   6       2

我一直在试图弄清楚如何以一种可以给我这些结果的方式连接这两个表,但我做错了。

SELECT people.id,people.name FROM people, rels
INNER JOIN rels children ON people.id = rels.parent
INNER JOIN rels siblings ON children.id = siblings.child
WHERE children.child = '1'

【问题讨论】:

  • 哈哈,抱歉 - 错字:p 打字时分心了 >_

标签: mysql sql join where-clause


【解决方案1】:

我想出了一个使用 UNION 的解决方案,我认为现在可以这样做。如果有人能提出一个纯粹基于 JOIN 的解决方案,我很乐意看到它!

SELECT people.*,c.* FROM rels
   INNER JOIN rels c ON rels.parent = c.parent
   INNER JOIN people ON people.id = c.child
   WHERE rels.child = '1' AND people.id <> '1'

UNION

SELECT people.*,p.* FROM rels
   INNER JOIN rels p ON rels.child = p.child
   INNER JOIN people ON people.id = p.parent
   WHERE rels.parent = '1' AND people.id <> '1'

http://sqlfiddle.com/#!2/45ba3/103/0

【讨论】:

    【解决方案2】:

    试试这个

       SELECT people.id,people.name  FROM people
       LEFT JOIN rels children ON people.id = children.parent
       LEFT JOIN rels siblings ON people.id = siblings.child
       WHERE children.child = '1'
       group by people.id
    

    DEMO HERE

    【讨论】:

    • 我认为这很接近,但也应该返回 sally。她是汤姆的孩子,汤姆是乔尼的父母。我试过“ SELECT people.id,people.name FROM people LEFT JOIN rels children ON people.id = children.parent LEFT JOIN rel parents ON people.id = parents.child LEFT JOIN rels兄弟姐妹 ON people.id =兄弟姐妹.child WHERE children.child = '1' OR parents.parent = '1' group by people.id" - 抱歉格式化,但这也返回了一个账单,他只是 jonny 的孩子。
    • 是的,当孩子 1 岁 (jonny) 时,你得到了他的父母 (tom) 并且你希望得到 sally 意味着你想要得到输入的 1 的兄弟/姐妹 (jonny) ?因为莎莉和乔尼有同一个父母。所以你不想得到父母,你想要得到兄弟?
    【解决方案3】:

    我还没有测试过,但这应该可以工作:

    SELECT ppl.* from people as ppl
    INNER JOIN rels AS par1 on ppl.id = par1.child
    INNER JOIN rels as par2 on par2.parent = par1.parent
    INNER JOIN people as sib on sib.id = par2.child
    WHERE ppl.id = '3'
    

    以 sally (id = 3) 为例说明

    从 PPL 中选择要为其找到兄弟姐妹的人。 (id = 3)

    从 PAR1(父级)选择其父级。 Parent = 2 被选中

    From PAR2 (Parent) select same parent Parent = 2 被选中

    从 SIB(人物)中选择 id = 3,1 的详细信息

    如果这不起作用,请告诉我......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-03
      • 2016-10-21
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2016-09-20
      • 2014-11-15
      • 1970-01-01
      相关资源
      最近更新 更多