2013-06-27 4 views
2

Извинитесь заранее, я новичок в (My) SQL - это должен быть простой вопрос для экспертных администраторов баз данных, но я даже не знаю, где начать находить решение вообще. Я даже не уверен, правильно ли я применил LEFT JOIN.MySQL: ограничение запроса или подзапрос (в левом/внутреннем соединении?)

My (DB) структура довольно проста:

У меня есть testsuite с, и несколько testcase s связаны друг с testsuite ("логических объектов") Во время тестовый кик-офф, я создаю запись для каждого testsuite в таблице testsuiteinstance - и одна запись в testcaseinstance для каждого testcase.

Моя цель состоит в том, чтобы принести последние 10 testcaseinstance сек всех testcase с принадлежащим к определенному testsuite

Это запрос, который я использую для извлечения всехtestcaseinstances:

SELECT * FROM testcaseinstance AS tcinst 
LEFT JOIN testsuiteinstance tsinst ON tsinst.id=tcinst.testsuiteinstance_id 
LEFT JOIN testsuite ts ON ts.id=tsinst.testsuite_id 
WHERE ts.id = 349 ORDER BY tcinst.id DESC; 

Итак, давайте скажем, у меня два testcase s в testsuite и оба testcase были выполнены 100 раз. Этот запрос дает мне 200 строк. Если я поставлю «LIMIT 10» в конце, я получу только последние 10 строк для одного testcase, но я хочу 20 строк (последние 10-10 принадлежат двум testcase s)

Я был бы признателен какое-нибудь описание рядом с запросом на решение или указатель на «учебник», я могу начать изучать связанные с темой (что бы это ни было: D)

Заранее благодарен!

ответ

0

Вот один из подходов; Рассмотрим это (немного надуманный) пример ...

SELECT * FROM ints; 

+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

Допустим, мы хотим вернуть верхние 3 четные номера и верхние 3 нечетные числа из этого списка. Не обращая внимания на данный момент, что есть другое, более простое, решение этого конкретного примера мы можем вместо этого сделать что-то вроде этого ...

SELECT x.* 
    , COUNT(*) rank 
    FROM ints x 
    JOIN ints y 
    ON MOD(y.i,2) = MOD(x.i,2) 
    AND y.i >= x.i 
GROUP 
    BY i 
ORDER 
    BY MOD(x.i,2) DESC 
    , x.i DESC; 
+---+------+ 
| i | rank | 
+---+------+ 
| 9 | 1 | 
| 7 | 2 | 
| 5 | 3 | 
| 3 | 4 | 
| 1 | 5 | 
| 8 | 1 | 
| 6 | 2 | 
| 4 | 3 | 
| 2 | 4 | 
| 0 | 5 | 
+---+------+ 

Отсюда, процесс захвата только топ-3 из каждой группы становится тривиальным .. .

SELECT x.* 
    , COUNT(*) rank 
    FROM ints x 
    JOIN ints y 
    ON MOD(y.i,2) = MOD(x.i,2) 
    AND y.i >= x.i 
GROUP 
    BY i 
HAVING rank <=3 
ORDER 
    BY MOD(x.i,2),x.i DESC; 
+---+------+ 
| i | rank | 
+---+------+ 
| 8 | 1 | 
| 6 | 2 | 
| 4 | 3 | 
| 9 | 1 | 
| 7 | 2 | 
| 5 | 3 | 
+---+------+ 

... и это может быть упрощено ...

SELECT x.* 
    FROM ints x 
    JOIN ints y 
    ON MOD(y.i,2) = MOD(x.i,2) 
    AND y.i >= x.i 
GROUP 
    BY i 
HAVING COUNT(*) <=3; 

+---+ 
| i | 
+---+ 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 
+0

Извините, но ваши отступы чисто поврежден мозг :-) – TMS

+0

Ну, они говорят, что красота в глазах T он смотрит. – Strawberry

+0

Ну, в случае вашего сообщения это может быть * только * там: D – TMS