【问题标题】:Join two Joins?加入两个加入?
【发布时间】:2020-08-01 14:43:58
【问题描述】:

是否可以加入以下两个查询,以便每个 audioid 的标签都包含在返回的数组中?

SELECT audioposts.audioname, audioposts.userid, audioposts.audioid, users.gavatar, //users.name, users.email, audioposts.title, audioposts.likes, audioposts.userid FROM audioposts LEFT JOIN //users ON users.id = audioposts.userid

SELECT tagname FROM entitytag LEFT JOIN tags ON entitytag.tagid = tags.tagid WHERE entitytag.audioid = '$audioid'

【问题讨论】:

  • 帮助我们帮助您 - 分享一些示例数据以及您希望获得的结果
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • 即使我用密码保护我的网页也是如此吗?
  • 加入这些查询可能是可能的,但目前还不清楚这是否有意义。你需要分享更多细节

标签: mysql join left-join


【解决方案1】:

看起来你只是想要更多left joins:

SELECT 
    ap.audioname, 
    ap.userid, 
    ap.audioid, 
    u.gavatar, 
    u.name, 
    u.email, 
    ap.title, 
    ap.likes, 
    ap.userid,
    t.tagname
FROM audioposts ap 
LEFT JOIN users u ON u.id = ap.userid
LEFT JOIN entitytag et on et.audioid = ap.audioid
LEFT JOIN tags t on t.tagid = et.tagid

我怀疑这会使行数增加,因为audiopost 可能有多个标签。您可能希望将所有标签名称收集在一起,例如使用字符串聚合。相关的子查询对此很有意义:

SELECT 
    ap.audioname, 
    ap.userid, 
    ap.audioid, 
    u.gavatar, 
    u.name, 
    u.email, 
    ap.title, 
    ap.likes, 
    ap.userid,
    (
        SELECT GROUP_CONCAT(t.tagname)
        FROM entitytag et
        LEFT JOIN tags t on t.tagid = et.tagid
        WHERE et.audioid = ap.audioid
    ) tagnames
FROM audioposts ap 
LEFT JOIN users u ON u.id = ap.userid

【讨论】:

  • 你是对的,每个audioid都有三个标签。所以我尝试了你的第二个选项,但我猜我犯了一个错误。我的 PHP 日志说; “试图获取非对象的属性‘num_rows’”。将仔细检查我的代码。
  • @Meggy:子查询中有错字,ad.audioid 必须是 ap.audioid。你应该学会在你的 PHP 代码中捕获和报告 SQL 错误 - 它使调试 SQL 错误大大更容易。
猜你喜欢
  • 2015-02-07
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2019-12-01
  • 2019-05-24
  • 2019-10-09
相关资源
最近更新 更多