7

私は2つのテーブルを持っています:tableA (idA, titleA)そしてtableB (idB, idA, textB)それらの間に1対多の関係があります。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では、最初のテーブルのidBでグループ化しているため、クエリごとにグループ化されている場合でも使用できます。したがって、グループごとtB1.textBに単一の値しかありません...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
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 に答える
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 に答える