2017-01-08 3 views
0

Представьте У меня есть таблица, как это с многими одного отношенияСоединение слева с пагинацией (LIMIT)

Table1

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

и

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

если я запускаю запрос на выборку по Таблица 1 с левым соединением для таблицы 2, но ограничьте его до 3 результатов. Я получу 3 строки, возвращенные

1 - as - QW
2 - DF - эр
3 - GH - ти

однако я хочу

1 - а - QW
2 - DF - эр
3 - GH - [ти, щ]

Теперь, сейчас я выбираю его как обычно, а затем помещаю elsecontents в массив самостоятельно, чтобы превратить свои строки в то, как я их хочу, но проблема остается в том, что я не могу вернуть все строки, которые я хочу.

Логично, я предполагаю, что хочу ограничить X уникальным table1.id, а не ограничиваться только X строками, но я не знаю, как реализовать эту логику, если это возможно.

Конечно, это легко, если я выбираю все в базе данных, а затем сортирую его на PHP, но это слишком интенсивно, и я не хочу выбирать 20 000 строк, чтобы получить ~ 10 строк. Я предполагаю, что хакерский подход вокруг этого будет состоять в том, чтобы выбрать 30 строк, а затем выполнить мою собственную сортировку и вернуть 10, как я их хочу, но мне кажется глупо выбирать больше, чем мне нужно.

Возможно, стоит упомянуть, но я использую Symfony3 w/Doctrine и используя построитель запросов. Но я не прошу о том, чтобы копировать/вставлять ответы на мою проблему, а просто толчок в направлении, чтобы я мог работать над моей реализацией.

Благодаря

ответ

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 самостоятельно, но это все золотисто. –