2017-01-08 10 views
0

は、私が選択クエリを実行する場合、私は多くの1の関係左ページネーションと(LIMIT)を参加

表1

id | name 
    1 | as 
    2 | df 
    3 | gh 

id | othercontents | table1relationship 
    1 | qw   | 1 
    2 | er   | 2 
    3 | ty   | 3 
    4 | ui   | 3 

と、このようなテーブルを持っている想像してみてTable1はTable2の左結合で、3つの結果に制限します。返される行は3つです。

1 - QW
2 - DF - ER
3 - GH - TY

しかし欲しい

1 - のような - QW
2 - DF - ER
3 - GH - [TY、UI]

現在、私は通常の方法でそれを選択し、自分自身の行を自分のやり方に変えるために配列にothercontentsを入れていますが、問題は残りの行を返すことができません。

論理的には、私はX個の行に限定するのではなく、X個の一意のtable1.idに制限したいと考えていますが、それが可能であればこのロジックを実装する方法はわかりません。

私はデータベース内のすべてを選択してPHPでソートするのは簡単ですが、これはあまりにも集中しており、〜10行を取得するために20,000行を選択したくありません。私は30行を選択してから自分のソートを行い、10を返すことになると思うが、必要以上に選択するのはまだ馬鹿だ。

おそらく言及する価値がありますが、私はDoctrineを使ってSymfony3を使用しており、クエリビルダーを使用しています。しかし私は私の実装に取り​​組むことができるので、私の問題にコピー/ペーストの答えを求めているのではなく、方向を追うだけです。

ありがとうございます。

答えて

1

ここでは、結果が得られるようにするためのクエリです(あなたが正しく理解している場合)。

SELECT t1.id,t1.name, 
    CONCAT(IF(sum(1)>1,'[',''), GROUP_CONCAT(t2.othercontents), IF(sum(1)>1,']','')) AS name2 
FROM (
    SELECT * 
    FROM table1 
    LIMIT 3 
    ) as t1 
LEFT JOIN table2 t2 on t2.table1relationship = t1.id 
GROUP BY t2.table1relationship; 

サンプル

mysql> SELECT * from table1; 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | as | 
| 2 | df | 
| 3 | gh | 
+----+------+ 
3 rows in set (0,00 sec) 

mysql> SELECT * from table2; 
+----+---------------+--------------------+ 
| id | othercontents | table1relationship | 
+----+---------------+--------------------+ 
| 1 | qw   |     1 | 
| 2 | er   |     2 | 
| 3 | ty   |     3 | 
| 4 | ui   |     3 | 
+----+---------------+--------------------+ 
4 rows in set (0,00 sec) 

結果

mysql> SELECT t1.id,t1.name, 
    ->  CONCAT(IF(sum(1)>1,'[',''), GROUP_CONCAT(t2.othercontents), IF(sum(1)>1,']','')) AS name2 
    -> FROM (
    ->  SELECT * 
    ->  FROM table1 
    ->  LIMIT 3 
    -> ) as t1 
    -> LEFT JOIN table2 t2 on t2.table1relationship = t1.id 
    -> GROUP BY t2.table1relationship; 
+----+------+---------+ 
| id | name | name2 | 
+----+------+---------+ 
| 1 | as | qw  | 
| 2 | df | er  | 
| 3 | gh | [ui,ty] | 
+----+------+---------+ 
3 rows in set (0,00 sec) 

mysql> 
+0

こんにちはバディ あなたは、私が行っていた場所の要点を得るように見えた私は必要なすべてが実際にGROUP_CONCATだったとグループをt2.relationshipで追加する DQLを使用しているので、私はGROUP_CONCATを自分で登録しなければならなかったが、それはすべて金色だ。 –

関連する問題