2015-03-19 55 views
1

可以说我有这个表:Mysql的选择与IN,限行1对每场比赛

| id | record_id | date_updated | 
|----|-----------|--------------| 
| 1 | 1   | 19-03-2015 | 
| 2 | 1   | 18-03-2015 | 
| 3 | 1   | 17-03-2014 | 
| 4 | 2   | 01-01-2015 | 
| 5 | 2   | 05-02-2015 | 

所以我要寻找的结果是:

| id | record_id | date_updated | 
|----|-----------|--------------| 
| 1 | 1   | 19-03-2015 | 
| 4 | 2   | 01-01-2015 | 

我有记录阵列IDS。

$ records = [1,2];

所以我可以这样做:

select * from `mytable` 
WHERE `record_id` IN ($records) 
AND mytable.date_update > 01-01-2014 
AND mytable.date_updated < 12-12-2015 

因此MySQL将选择记录至极的比赛日期date_updated标准(以及记录ID OFC),这对于每一个记录ID是更多然后1,基本上我要让他限制每个$ record_id的行数为1

如果这甚至是可能的。

//很难解释这个问题,真正的情况是这是另一个查询的子查询,但真正的例子是10行查询和100列表,所以它会更难解释情况并让某人读取它/ udnerstands。希望有人能理解我的问题,如果不是,我会尽力解释更多。

感谢

+0

尝试解释,什么不适用于您的查询。你输错了吗?如果是,哪个输出? – OddDev 2015-03-19 12:05:18

+0

我在底部发布了一个编辑 – Izopi4a 2015-03-19 12:07:37

+0

不知道是否解决了你的问题,但是在mysql中有一个叫做limit的函数[http://www.w3schools.com/php/php_mysql_select_limit.asp] – katmanco 2015-03-19 12:07:57

回答

1

您可以尝试使用group by条款

SELECT * 
    FROM `mytable` 
WHERE id IN (
       SELECT min(id) 
       FROM `mytable` 
       WHERE `record_id` IN ($records) 
       AND mytable.date_update > 01-01-2014 
       AND mytable.date_updated < 12-12-2015 
       group by record_id 
      ); 
+1

非常棒,非常感谢。因为在我的公司我们正在运行5.1(mysql)查询被卡住发送数据,必须手动杀死,但在我的服务器上测试5.6.23工程膨胀。 – Izopi4a 2015-03-19 13:58:18

0

有很多方法可以让每个组的记录,因为你只需要一次就可以轻松做到如下

select t1.* from table_name t1 
where (
    select count(*) from table_name t2 
    where t1.record_id = t2.record_id 
) > =0 
and 
t1.date_updated > '2014-01-01' and date_updated < '2015-12-12' 
group by t1.record_id ; 

还有其他的方式使用left join

select t1.* from table_name t1 
left join table_name t2 on t1.record_id = t2.record_id 
and t1.id >t2.id where t2.id is null 

这会给你与ASC订单数据与id

如果您需要最大(ID)的数据为record_id,您可以使用

t1.id < t2.id 

,而不是

t1.id >t2.id 

的您可以对第一个查询进行相同的比较。