【问题标题】:NodeJS Mysql Query - How to Join 2 Selects in a Select?NodeJS Mysql 查询 - 如何在一个选择中加入 2 个选择?
【发布时间】:2021-10-01 05:31:56
【问题描述】:

我在 Mysql 中使用 NodeJS 进行复杂查询。首先,我需要从entitytag 表中获取tagid1、tagid2 和tagid3。然后我需要使用这些获取的 tagid 来获取 tags 表中每个 tagid 的标记名。这是一个产生错误的查询,告诉我“未定义 tagid1”。

 row_c = await db.query( `SELECT 
        ap.audioname, 
        ap.userid, 
        ap.audioid, 
        ap.title, 
        ap.likes, 
        u.gavatar,  
        u.name, 
        u.email,
        (SELECT tagid1 FROM entitytag et LEFT JOIN tags t on t.tagid = et.tagid1 WHERE et.audioid = ap.audioid)tagid1,  
        (SELECT tagid2 FROM entitytag et LEFT JOIN tags t on t.tagid = et.tagid2 WHERE et.audioid = ap.audioid)tagid2, 
        (SELECT tagid3 FROM entitytag et LEFT JOIN tags t on t.tagid = et.tagid3 WHERE et.audioid = ap.audioid)tagid3,
        (SELECT tagname FROM tags WHERE tagid = ?),
        (SELECT tagname FROM tags WHERE tagid = ?),
        (SELECT tagname FROM tags WHERE tagid = ?)
        FROM audioposts ap LEFT JOIN accounts u ON u.id = ap.userid WHERE ap.audioid = ?`, [tagid1, tagid2, tagid3, audioid ]);

其实我并不需要tagid1、tagid2、tagid3的返回。我只是使用它们从标签表中获取标签名。

我做错了什么?如何定义“tagid1”?

【问题讨论】:

  • 您的参数 ([audioid, tagid1, tagid2, tagid3 ]) 似乎顺序错误。它们应该与查询中的? 的顺序相同
  • 好发现!我已经编辑了这个问题,所以你的观察很有帮助。但不幸的是它仍然没有解决问题。

标签: mysql node.js select concatenation left-join


【解决方案1】:

我建议在观察几次后重写您的查询。我注意到您的代码中有一些相似之处,并且还观察到您声明您首先尝试检索 tagid1-3。

因此,我重写了查询以使用LEFT JOINs,因为这将包括可用的详细信息和简化别名。

现在查询基于 et.audioid = ap.audioid 检索entitytag 记录,如原始查询中所示,但不需要tagId 作为查询参数,即此处[tagid1, tagid2, tagid3, audioid ],因为从您的选择/投影中获得的目标是检索tagid1-3 的tagId 和tagname。

现在我们将匹配entitytag 记录(如果存在),我们可以继续从标签表中检索相关的标签信息。我已经使用 3 个额外的 LEFT JOIN 对同一个表进行了此操作,但使用了不同的别名,例如 LEFT JOIN tags t{num} ON et.tagid1 = t{num}.tagid 其中num 代表每个标签的1-3。如果这些详细信息可用,则它们将在投影中检索为非空值,使用

    t1.tagId as tagId1,
    t1.tagname as tagname1,
    t2.tagId as tagId2,
    t2.tagname as tagname2,
    t3.tagId as tagId3,
    t3.tagname as tagname3

最后,由于查询检索到所需的 tagId 详细信息,因此这些不再作为参数传递。这会导致audioid只有一个参数,即WHERE ap.audioid = ?, [audioid ])`。

我在下面包含了建议的查询。请让我知道这是否适合您。

row_c = await db.query( `
SELECT 
    ap.audioname, 
    ap.userid, 
    ap.audioid, 
    ap.title, 
    ap.likes, 
    u.gavatar,  
    u.name, 
    u.email,
    t1.tagId as tagId1,
    t1.tagname as tagname1,
    t2.tagId as tagId2,
    t2.tagname as tagname2,
    t3.tagId as tagId3,
    t3.tagname as tagname3
FROM 
    audioposts ap 
LEFT JOIN 
    accounts u ON u.id = ap.userid 
LEFT JOIN
    entitytag et ON et.audioid = ap.audioid
LEFT JOIN
    tags t1 ON et.tagid1 = t1.tagid
LEFT JOIN
    tags t2 ON et.tagid2 = t2.tagid
LEFT JOIN
    tags t3 ON et.tagid3 = t3.tagid

WHERE ap.audioid = ?`, [audioid ]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2014-12-08
    • 2012-10-15
    • 2011-08-21
    相关资源
    最近更新 更多