7

我有两个表:它们tableA (idA, titleA)之间tableB (idB, idA, textB)存在一对多的关系。对于 tableA 中的每一行,我想检索 tableB 中对应的最后 5 行(按 idB 排序)。

我试过了

SELECT * FROM tableA INNER JOIN tableB ON tableA.idA = tableB.idA LIMIT 5

但这只是限制了 INNER JOIN 的全局结果,而我想限制每个不同 tableA.id 的结果

我怎样才能做到这一点 ?

谢谢

4

4 回答 4

5

非常简化和更正的 Carlos 解决方案(他的解决方案将返回前 5 行,而不是最后...):

SELECT tB1.idA, tB1.idB, tB1.textB
FROM tableB as tB1
    JOIN tableB as tB2
        ON tB1.idA = tB2.idA AND tB1.idB <= tB2.idB
GROUP BY tB1.idA, tB1.idB
HAVING COUNT(*) <= 5

在 MySQL 中,tB1.textB即使是按查询分组,您也可以使用,因为您是按第一个表中的 idB 分组的,所以tB1.textB每个组只有一个值...

于 2012-04-17T16:49:51.873 回答
2

我认为这是你需要的:

SELECT tableA.idA, tableA.titleA, temp.idB, temp.textB
FROM tableA
INNER JOIN
(
    SELECT tB1.idB, tB2.idA,
    (
        SELECT textB
        FROM tableB
        WHERE tableB.idB = tB1.idB
    ) as textB
    FROM tableB as tB1
        JOIN tableB as tB2
            ON tB1.idA = tB2.idA AND tB1.idB >= tB2.idB
    GROUP BY tB1.idA, tB1.idB
    HAVING COUNT(*) <= 5
    ORDER BY idA, idB
) as temp
ON tableA.idA = temp.idA

有关此方法的更多信息在这里:

http://www.sql-ex.ru/help/select16.php

于 2012-04-17T13:25:56.870 回答
0

确保您的“B”表在 (idA, idB) 上有一个索引,以便按目的优化顺序,因此对于每个“A”ID,它可以快速使“B”顺序降序,从而将最新的每个“A”放在顶部ID。使用 MySQL 变量,每次“A”ID 更改时,它会将下一个“A”ID 的排名重置为 1。

select 
      B.idA,
      B.idB,
      B.textB
      @RankSeq := if( @LastAGroup = B.idA, @RankSeq +1, 1 ) ARankSeq,
      @LastAGroup := B.idA as ignoreIt
   from
      tableB B
         JOIN tableA A
            on B.idA = A.idA,
      (select @RankSeq := 0, @LastAGroup := 0 ) SQLVars 
   having
      ARankSeq <= 5
   order by
      B.idA,
      B.idB DESC
于 2012-04-17T13:17:31.260 回答
0
select * from tablea ta, tableb tb
where ta.ida=tb.idb and tb.idb in 
(select top 5 idb from tableB order by idb asc/desc)
  • (如果你想要更低的 id,则为 asc,如果你想要更高的 id,则为 desc)
  • 更简单,更容易包含更多条件
  • 如果 mysql 中不存在 top 子句,请使用 limit 子句(我对 mysql 了解不多)
于 2012-04-17T13:50:07.500 回答