如何创建多列主键mysql_如何在MySQL中通过多列主键选择多行?

我有一个包含多列主键(城市/州/日期)和更多数据列的表.我希望得到每个城市/州的最新数据.如何干净/高效地完成这项工作?现在我可以通过执行第一个查询来获取我正在尝试获取的所有行的列表,然后使用大量WHERE子句进行第二次查询:

SELECT state, city, max(date) from data GROUP BY city, state;

+-------+---------------------+------------+

| state | city | MAX(date) |

+-------+---------------------+------------+

| CA | San Francisco | 2013-09-01 |

| CA | Los Angeles | 2013-08-01 |

| NY | New York | 2013-10-01 |

| ... | ... (many rows) ... | ... |

+-------+---------------------+------------+

SELECT * FROM data WHERE

(state = "CA" AND city = "San Francisco" AND date='2013-09-01') OR

(state = "CA" AND city = "Los Angeles" AND date='2013-08-01') OR

(state = "NY" AND city = "New York" AND date='2013-10-01') OR

...

这真的很丑陋且效率低下,如果第一个查询返回很多行,我的第二个查询可能会太长.显然,如果我有一个单列主键,我可以使用带有IN()的子选择,但这在这里是不可能的.有什么建议?

更新:我用一个subselect尝试了Bill的建议,但它没有使用任何键,而是永远.如果我将subselect限制为仅返回5行,则返回0.64s.如果我让它返回所有73个城市/州组合,则需要很长时间(查询仍在运行).

EXPLAIN SELECT * FROM data WHERE (city, state, date) IN (SELECT state, city, MAX(date) FROM data GROUP BY city, state)

+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+

| 1 | PRIMARY | data | ALL | NULL | NULL | NULL | NULL | 13342 | Using where |

| 2 | DEPENDENT SUBQUERY | data | index | NULL | PRIMARY | 57 | NULL | 8058 | Using index |

+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值