NodeJS Mysql 查询 - 如何在 Select 中加入 2 Select?

NodeJS Mysql Query - How to Join 2 Selects in a Select?

我在 Mysql 中使用 NodeJS 进行复杂查询。首先,我需要从 entitytag table 中获取 tagid1tagid2tagid3。然后我需要使用那些获取的标签来获取 tags table 中每个标签的标签名。这是一个产生错误的查询,它告诉我“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 的 return。我只是用它们从标签 table.

中获取标签名

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

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

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

现在查询根据原始查询中显示的 et.audioid = ap.audioid 检索 entitytag 记录,但不需要 tagId 作为查询参数,即此处 [tagid1, tagid2, tagid3, audioid ] 因为 objective,从你的 select/projection 中获取的是检索 tagid1-3 的 tagId 和 tagname。

现在我们将匹配 entitytag 记录(如果存在),我们可以继续从标签 table 中检索相关标签信息。我已经使用 3 个额外的 LEFT JOIN 连接到相同的 table,但使用了不同的别名,例如 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 ]);