Выберите максимальные значения из двойной таблицы - PullRequest
0 голосов
/ 07 января 2019

В БД у меня есть три таблицы, такие как:

+-----------------+--------+
| ident (PrimKey) | ident2 |
+-----------------+--------+
|             123 |    333 |
|             321 |    334 |
|             213 |    335 |
|            1234 |    336 |
+-----------------+--------+

+---------+----------+-------+-------+
| PrimKey | group_id | value | ident |
+---------+----------+-------+-------+
|       1 |        1 |    10 |   213 |
|       2 |        1 |     5 |   321 |
|       3 |        1 |    15 |  1234 |
|       4 |        1 |    10 |  1234 |
|       5 |        2 |     7 |   213 |
|       6 |        2 |    15 |   321 |
+---------+----------+-------+-------+

+---------+----------+----------+
| PrimKey | ident2_1 | ident2_2 |
+---------+----------+----------+
|       1 |      333 |      334 |
|       2 |      333 |      335 |
|       3 |      333 |      336 |
+---------+----------+----------+

Третья таблица - это соединение двух строк первой. И второе Содержит данные из другой группы этих строк.

Мне нужно найти максимальные значения из второй таблицы, сгруппированные по group_id для конкретных пользовательских строк из третьей таблицы. В примере 333. Правильный ответ должен быть:

+----------+-------+-------+
| group_id | value | ident |
+----------+-------+-------+
|        1 |    15 |  1234 |
|        2 |    15 |   321 |
+----------+-------+-------+

Но сейчас у меня отсортированы все строки:

+----+----------+-------+-------+
|    | group_id | value | ident |
+----+----------+-------+-------+
|  1 |        1 |    15 |  1234 |
|  2 |        1 |    10 |   213 |
|  3 |        1 |     5 |   321 |
|  4 |        2 |    15 |   321 |
|  5 |        2 |    10 |  1234 |
|  6 |        2 |     7 |   213 |
+----+----------+-------+-------+

Или исправить строки с неверными идентификаторами

+----+----------+-------+-------+
|    | group_id | value | ident |
+----+----------+-------+-------+
|  1 |        1 |    15 |   213 |
|  2 |        2 |    15 |  1234 |
+----+----------+-------+-------+

sql:

DROP TABLE first;
DROP TABLE second;
DROP TABLE third;


CREATE TABLE first(group_id integer, value integer, ident integer);
CREATE TABLE second(ident integer, ident2 integer);
CREATE TABLE third(ident_1 integer, ident_2 integer);

INSERT INTO first VALUES(1, 10, 213);
INSERT INTO first VALUES(1, 5, 321);
INSERT INTO first VALUES(1, 15, 1234);

INSERT INTO first VALUES(2, 10, 1234);
INSERT INTO first VALUES(2, 7, 213);
INSERT INTO first VALUES(2, 15, 321);


INSERT INTO second VALUES(123, 333);
INSERT INTO second VALUES(321, 334);
INSERT INTO second VALUES(213, 335);
INSERT INTO second VALUES(1234, 336);

INSERT INTO third VALUES (333, 334);
INSERT INTO third VALUES (333, 335);
INSERT INTO third VALUES (333, 336);


SELECT f.group_id, max(f.value) as value, f.ident
FROM first as f
INNER JOIN second AS s ON f.ident = s.ident
INNER JOIN third AS t ON t.ident_2 = s.ident2
WHERE t.ident_1 = '333'
GROUP BY f.group_id
ORDER BY f.group_id ASC, f.value DESC;


SELECT f.group_id, f.value as value, f.ident
FROM first as f
INNER JOIN second AS s ON f.ident = s.ident
INNER JOIN third AS t ON t.ident_2 = s.ident2
WHERE t.ident_1 = '333'
ORDER BY f.group_id ASC, f.value DESC;

Проверено на: https://rextester.com/l/mysql_online_compiler

Привет

EDIT:

Третья таблица - это что-то вроде связи между друзьями с строками во второй таблице. И первая таблица содержит оценки для различных задач, с которыми идентифицируется group_id. Мне нужны лучшие оценки друзей для разных задач. Итак, список друзей у меня из третьей таблицы. И оценки у меня с первого. Связь между этими таблицами - вторая.

EDIT2:

В первой таблице первичным ключом является идентификатор (PrimKey).

Второй и третий в качестве первичного ключа имеют только еще один столбец.

Во втором столбце идентификатора столбца находится индекс, связанный с идентификатором (PrimKey) из первой таблицы.

В третьей таблице столбцы ident2_1 и ident2_2 являются индексами, связанными с indet2 из первой таблицы.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я придумал этот SQL:

SELECT f.group_id, f.value as value, f.ident
FROM   first as f
INNER JOIN second AS s 
      ON f.ident = s.ident
INNER JOIN third AS t 
      ON t.ident_2 = s.ident2
WHERE t.ident_1 = '333'
and   f.value IN (  SELECT MAX(f1.value) 
                    FROM first as f1 
                    WHERE f1.group_id = f.group_id )
ORDER BY f.group_id ASC, f.value DESC;
0 голосов
/ 07 января 2019

Конечно, есть более элегантное решение, но оно даст результат, о котором вы просили.

select m.*
from(
    select f.group_id, f.value value, f.ident
    from   first f,
           second s,
           third t
    where  f.ident = s.ident
    and    t.ident_2 = s.ident2
    and    t.ident_1 = '333'
    ORDER BY f.group_id ASC, f.value DESC ) m,
(
    select max(f.value) value
    from   first f,
           second s,
           third t
    where  f.ident = s.ident
    and    t.ident_2 = s.ident2
    and    t.ident_1 = '333' ) n
where m.value = n.value

вот второй (также неуклюжий) метод, который дает желаемые результаты:

select f.group_id, f.value value, f.ident
from   first f,
       second s,
       third t
where  f.ident = s.ident
and    t.ident_2 = s.ident2
and    t.ident_1 = '333'
and    value = (   select max(f.value) value
                   from   first f,
                          second s,
                          third t
                   where  f.ident = s.ident
                   and    t.ident_2 = s.ident2
                   and    t.ident_1 = '333' )
ORDER BY f.group_id ASC, f.value DESC 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...