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

У меня есть массив с записью идентификаторы.

$ 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 будет выбирать записи Wich соответствия date_updated критериям (и идентификатор записи OFC), которые являются более 1 для каждой записи ID, в основном я хочу, чтобы сделать его ограничьте строки для каждого $ record_id до 1

Если это возможно.

// Сложно объяснить проблему, реальный случай заключается в том, что это подзапрос другого запроса, но реальный пример - это 10 строк запроса и 100 столбцов таблицы, поэтому будет еще сложнее объяснить ситуацию и кому-то прочитать ее/udnerstands. Надеюсь, кто-то поймет мою проблему, если не попытаюсь объяснить больше.

Благодаря

+0

Попробуйте объяснить, что не работает с вашим запросом. Вы получаете неправильный результат? Если да, то какой вывод? – OddDev

+0

Я разместил редактирование внизу – Izopi4a

+0

Не уверен, что решает вашу проблему, но есть функция, называемая пределом в mysql. [Http://www.w3schools.com/php/php_mysql_select_limit.asp] – katmanco

ответ

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

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 

такое же сравнение вы можете сделать с первым запросом.

Смежные вопросы