Как извлечь строку с максимальным значением? - PullRequest
0 голосов
/ 24 декабря 2010

У меня есть две таблицы, и я хочу сделать следующее.Из первой таблицы я извлекаю все строки, которые удовлетворяют заданному условию.Для всех извлеченных строк я беру значение из первого столбца.Для каждого значения я извлекаю все необработанные данные из второй таблицы, которые содержат данное значение в первом столбце.Все исходные тексты, извлеченные из второй таблицы, должны быть упорядочены особым образом, и я хочу взять только одну строку, которая является первой (в соответствии с критериями упорядочения).Это моя проблема, я не знаю, как взять одну строку с наибольшим значением критерия заказа.

ДОБАВЛЕНО

Первая таблица:

| aaa | Bob |
| bbb | Eva |
| ccc | Bob |

Вторая таблица:

| aaa | 111 | 1 |
| aaa | 342 | 2 |
| ccc | 576 | 1 |
| ccc | 749 | 3 |

Из первой таблицы я беру все строки, содержащие Боба.Первый столбец в этих строках содержит следующие значения: «aaa» и «ccc».Для «ааа» во второй таблице у меня есть две строки, и я хочу взять те, которые имеют максимальное значение в последнем столбце.Итак, у меня есть |aaa|342|2|.То же самое я делаю с "ccc".Я беру этот ряд | CCC | 749 | 3 |.И наконец, я хочу упорядочить две строки в соответствии со значением последнего столбца.

ДОБАВЛЕНО 2

Я только что понял, что суть проблемы заключается вследующим образом.В данной таблице я хочу заменить все строки, содержащие одинаковое значение в первых столбцах, на одну "репрезентативную" строку (которая имеет максимальное значение в третьем столбце) .Более подробно я хочу заменить эту таблицу:

| aaa | 111 | 1 |
| aaa | 342 | 2 |
| ccc | 576 | 1 |
| ccc | 749 | 3 |

на эту:

| aaa | 342 | 2 |
| ccc | 749 | 3 |

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010
select t2.* 
  from t1
  join t2 on t2.id = (select t2c.id 
                        from t2 as t2c 
                       where t2c.t1_id = t1.id 
                       order by t2c.val desc
                       limit 1)
 where t1.name = 'Bob'
 order by t2.val

Вы не указали имена столбцов, поэтому я их составил.

t2.id должно быть уникальным.

1 голос
/ 24 декабря 2010

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

mysql> select * from user;
+--------+-----------+
| userid | user_name |
+--------+-----------+
| aaa    | Bob       |
| bbb    | Eva       |
| ccc    | Bob       |
+--------+-----------+
3 rows in set (0.00 sec)

mysql> select * from user_data;
+--------+-------+------+
| userid | value | num  |
+--------+-------+------+
| aaa    |   111 |    1 |
| aaa    |   342 |    2 |
| ccc    |   576 |    1 |
| ccc    |   749 |    3 |
| bbb    |  1000 |    1 |
| bbb    |   800 |    2 |
+--------+-------+------+
6 rows in set (0.00 sec)

mysql> SELECT u1.userid,u1.user_name,ud1.value from user_data ud1 join user u1 ON ud1.userid=u1.userid where ud1.value=(SELECT value FROM user_data ud2 WHERE ud2.userid=ud1.userid ORDER BY value desc LIMIT 1) AND u1.user_name='Bob';
+--------+-----------+-------+
| userid | user_name | value |
+--------+-----------+-------+
| aaa    | Bob       |   342 |
| ccc    | Bob       |   749 |
+--------+-----------+-------+
2 rows in set (0.00 sec)
...