【问题标题】:RIGHT JOIN 3 tables to 1 left table, and joining a column from 2 other tables to the right sideRIGHT JOIN 3 个表到 1 个左表,并将 2 个其他表的列连接到右侧
【发布时间】:2013-01-05 18:57:38
【问题描述】:

我正在创建一个社交网络,我有一个非常具体的案例,而且我几乎得到了正确的查询。我有 6 个表要合并到一个查询中。 表recent 用于查找表brostplainegobrostbrostpublic 上的确切行,当还在membersegos 表上查找匹配项时会变得复杂,其中members.username 将是与列 id 上的 brostplainbrostpublic 匹配,并且 egos.egoname 将与列 egoid 上的 egobrost 匹配。所有这些都按 unix 时间戳排序,在 recent.realtime 列中。这是当前查询:

   SELECT recent.id, 
          recent.brosttype, 
          recent.postid, 
          recent.realtime, 
          members.username,
          egos.egoname, 
          brostplain.id, 
          brostplain.postid, 
          brostplain.content, 
          brostplain.up, 
          brostplain.down, 
          brostplain.timedata, 
          brostplain.realtime, 
          brostplain.attached, 
          brostplain.replies, 
          brostplain.ext, 
          brostplain.onpage, 
          brostplain.touser, 
          brostplain.isego, 
          brostplain.category, 
          egobrost.egoid, 
          egobrost.postid, 
          egobrost.content, 
          egobrost.up, 
          egobrost.down, 
          egobrost.timedata, 
          egobrost.realtime, 
          egobrost.attached, 
          egobrost.replies, 
          egobrost.ext, 
          egobrost.onpage, 
          egobrost.touser, 
          egobrost.isego, 
          egobrost.category, 
          brostpublic.id, 
          brostpublic.postid, 
          brostpublic.content, 
          brostpublic.up, 
          brostpublic.down, 
          brostpublic.timedata, 
          brostpublic.realtime, 
          brostpublic.attached, 
          brostpublic.replies, 
          brostpublic.ext, 
          brostpublic.category, 
          brostpublic.isego 
     FROM recent 
LEFT JOIN brostplain ON recent.brosttype=brostplain.brosttype 
      AND recent.postid=brostplain.postid 
LEFT JOIN brostpublic ON recent.brosttype=brostpublic.brosttype 
      AND recent.postid=brostpublic.postid 
LEFT JOIN egobrost ON recent.brosttype=egobrost.brosttype 
      AND recent.postid=egobrost.postid 
LEFT JOIN egos ON egos.egoid=egobrost.egoid
     JOIN members ON brostplain.id=members.id OR brostpublic.id=members.id 
    WHERE recent.id='2' ORDER BY recent.realtime DESC

现在这会获取所有相关行,但由于 egos 表的连接方式,它不会返回 egobrost 行的任何结果,而且我不知道在哪里放置连接或如何实现它。如果我在 egos 上省略 JOIN 并从我的 SELECT 中删除 egos.egoname,它将显示 egobrost 表上的行没问题,但我需要 egoname 作为我的输出。任何帮助将不胜感激。

编辑(已解决):经过深思熟虑,我通过在members 的 JOIN 中添加 LEFT 解决了这个问题。现在结果集就完成了。感谢那些做出贡献的人。

【问题讨论】:

  • 我不确定我是否理解 - 此查询返回“相关”行但不返回 egobrost 行?你怎么知道?是否有缺失的行,或者只是在您希望有数据的行中返回 NULL 值?
  • 我正在使用 phpMyAdmin 来测试我的查询,当我加入 egos 表时,结果中完全丢失了 egobrost 行。
  • 我看不出任何原因为什么存在或不存在 LEFT JOIN to egos 会从您的结果集中删除行,特别是因为所有行数似乎都由最近的表确定,brostplain, brostpublic 和成员。您是否有任何其他方法来测试查询以确保它不是引入问题的测试工具?
  • 我还在服务器上的 PHP mysql_query 中测试查询。 brostplain、brostpublic 和 egobrost 表中的行是通过将 brosttype 和 postid 列与 recent 表匹配来明确确定的。 members 和 egos 表的目的只是获取生成帖子的人的姓名。
  • 左连接应该对返回的行数没有影响。我有点担心您正在引用“缺少的行”而不是简单地具有 NULL 值。无论是否包含 LEFT JOIN to egos ,您是否总是在结果集中收到相同数量的行?

标签: mysql


【解决方案1】:

通过将成员上的 JOIN 更改为 LEFT JOIN 来解决,这与 egos 上的 LEFT JOIN 一致。这是最终的查询:

SELECT recent.id, 
          recent.brosttype, 
          recent.postid, 
          recent.realtime, 
          members.username,
          egos.egoname, 
          brostplain.id, 
          brostplain.postid, 
          brostplain.content, 
          brostplain.up, 
          brostplain.down, 
          brostplain.timedata, 
          brostplain.realtime, 
          brostplain.attached, 
          brostplain.replies, 
          brostplain.ext, 
          brostplain.onpage, 
          brostplain.touser, 
          brostplain.isego, 
          brostplain.category, 
          egobrost.egoid, 
          egobrost.postid, 
          egobrost.content, 
          egobrost.up, 
          egobrost.down, 
          egobrost.timedata, 
          egobrost.realtime, 
          egobrost.attached, 
          egobrost.replies, 
          egobrost.ext, 
          egobrost.onpage, 
          egobrost.touser, 
          egobrost.isego, 
          egobrost.category, 
          brostpublic.id, 
          brostpublic.postid, 
          brostpublic.content, 
          brostpublic.up, 
          brostpublic.down, 
          brostpublic.timedata, 
          brostpublic.realtime, 
          brostpublic.attached, 
          brostpublic.replies, 
          brostpublic.ext, 
          brostpublic.category, 
          brostpublic.isego 
     FROM recent 
LEFT JOIN brostplain ON recent.brosttype=brostplain.brosttype 
      AND recent.postid=brostplain.postid 
LEFT JOIN brostpublic ON recent.brosttype=brostpublic.brosttype 
      AND recent.postid=brostpublic.postid 
LEFT JOIN egobrost ON recent.brosttype=egobrost.brosttype 
      AND recent.postid=egobrost.postid 
LEFT JOIN egos ON egos.egoid=egobrost.egoid
LEFT JOIN members ON brostplain.id=members.id OR brostpublic.id=members.id 
    WHERE recent.id='2' ORDER BY recent.realtime DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多