0

我有两张桌子,想做以下事情。从第一个表中,我提取满足给定条件的所有行。对于所有提取的行,我从第一列中获取一个值。对于每个值,我从第二个表中提取包含第一列中给定值的所有原始值。从第二个表中提取的所有原始数据都必须以特定方式排序,我只想取第一行(根据排序标准)。这是我的问题,我不知道如何取排序标准值最高的一行。

添加

第一张表:

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

第二张表:

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

从第一个表中,我获取包含 Bob 的所有行。这些行中的第一列包含以下值:“aaa”和“ccc”。对于第二个表中的“aaa”,我有两行,我想取那些在最后一列中具有最大值的行。所以,我有|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 |
4

2 回答 2

2
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必须是独一无二的。

于 2010-12-24T12:44:02.087 回答
1

这可以使用相关的子查询来实现,但性能将非常糟糕。

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)
于 2010-12-24T13:03:29.990 回答