【问题标题】:mySQL query: for a given typeId, getting all entries with their answerCountmySQL 查询:对于给定的 typeId,获取所有条目及其 answerCount
【发布时间】:2011-05-16 04:05:56
【问题描述】:

我有一个名为 entry 的 mySQL 表。里面有2条测试记录:

SELECT * FROM entry WHERE typeId = 2   

我有不同的类型。例如,当 typeId = 2 时,这是一个问题。当 typeId = 3 时,这是一个答案。将答案插入此表时,linkId 列将填充它正在回答的问题的 entryId。

例如:

SELECT * FROM entry WHERE typeId = 3

如您所见,这两条记录的 typeId = 3 和 linkId 都指向 entryId = 1。

在以下查询中,我只得到具有相关答案的问题。

SELECT SQL_CALC_FOUND_ROWS
entry.entryId, entry.entryText, entry.voteCount AS voteCount,
USER.userName, USER.fbId, COUNT(e2.entryId) AS answerCount
FROM entry
INNER JOIN USER ON entry.userId = USER.userId
INNER JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
WHERE entry.active = 1 
AND entry.typeId = 2
ORDER BY entry.voteCount DESC

根据上面的陈述,我有 2 个 typeId = 2 的条目。所以我真的希望这个语句返回两个条目,但显然没有任何答案的条目的 answerCount 将为 0。

是否有人对我向您展示的内容有任何想法来修复此查询以获得所需的结果?

更新:

根据以下建议。我将内连接更改为左连接:

SELECT SQL_CALC_FOUND_ROWS DISTINCT
entry.entryId, entry.entryText, entry.voteCount AS voteCount,
USER.userName, USER.fbId
FROM entry
INNER JOIN USER ON entry.userId = USER.userId
LEFT JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
WHERE entry.active = 1 
AND entry.typeId = 2
ORDER BY entry.voteCount DESC

在这个语句中我取出了count语句(COUNT(e2.entryId) AS answerCount)。

这是结果:

当我放入 COUNT 语句时,它只返回当它是内部连接时返回的 1 条记录:


更新:

通过确保 LEFT JOIN 正确,并且当我添加 GROUP BY 时,我能够正确返回行,然后正确返回 0 个答案的行。

在下面查看我的查询。

【问题讨论】:

    标签: mysql sql tsql


    【解决方案1】:

    我认为您在条目表上的第二个联接应该是左联接:

    INNER JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
    

    应该是:

    LEFT JOIN entry AS e2 ON e2.linkId = entry.entryId AND e2.active=1
    

    【讨论】:

    • 我同意@Tudor,尝试使用 LEFT JOIN,这应该可以解决您的问题。
    • 和@Jako - 我试过了,结果还是一样。查看更新信息。
    • 如果您尝试按 entry.entryId 而不是 e2.entryId 计数会怎样?
    • 经过进一步审查,我确保我的 JOIN 是正确的,但是当我添加 GROUP BY 语句时,我得到了我正在寻找的结果。
    【解决方案2】:

    我真的让它工作了......

    这是我的更新声明:

    SELECT  e1.entryId, e1.entryText, e1.voteCount AS voteCount,
    USER.userName, USER.fbId, COUNT(e2.linkId)
    FROM    entry e1 
    INNER JOIN USER ON e1.userId = USER.userId
    LEFT JOIN entry e2 
    ON  e2.linkId = e1.entryId
    WHERE e1.active = 1
    AND e1.typeId = 2
    GROUP BY e1.entryId
    ORDER BY e1.voteCount DESC
    

    我按照建议添加了 LEFT JOIN,但我也确保了连接是正确的,最后一块拼图是 GROUP BY。一旦我把它放进去,我就得到了我最初寻找的 2 行。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2018-11-06
      • 2016-06-05
      • 1970-01-01
      相关资源
      最近更新 更多