2015-03-19 66 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 

的您可以對第一個查詢進行相同的比較。