2015-10-14 5 views
0

я пытаюсь получить самую раннюю запись из данных, который подобен этому образцу:Возврат ранняя запись с определенными критериями MYSQL

user_id Criteria_1 Criteria_2 Date 
1   1   1  1/1/2015 
1   0   1  2/1/2015 
1   1   0  3/1/2015 
2   0   0  1/1/2015 
2   0   1  2/1/2015 
2   1   0  3/1/2015 

Желаемый результат:.

user_id Criteria_1 Criteria_2 Date 
1   1   1  1/1/2015 
2   0   1  2/1/2015 

а) user_id должен быть уникальным б.) должны соответствовать один или оба Criteria_1, Criteria_2 гр.) ранняя дата

ответ

0

Попробуйте

SELECT user_id, 
SUBSTRING_INDEX(GROUP_CONCAT(Criteria_1 ORDER BY Date ASC),',',1) AS Crit_1, 
SUBSTRING_INDEX(GROUP_CONCAT(Criteria_2 ORDER BY Date ASC),',',1) AS Crit_2, 
SUBSTRING_INDEX(GROUP_CONCAT(Date ORDER BY Date ASC),',',1) AS date_unformat, 
SUBSTRING_INDEX(GROUP_CONCAT(DATE_FORMAT(Date,'%d/%m/%Y') ORDER BY Date ASC),',',1) AS date_format 
FROM table 
WHERE Criteria_1 =1 OR Criteria_2 =1 
GROUP BY user_id 
ORDER BY user_id 

Я добавил дату с двумя форматами. Вы можете использовать которые когда-либо применимо к вашему результате

+0

'FROM table_name' отсутствует в запросе. – Wanderer

0

Предполагая, что ваши даты VARCHAR или TEXT типа, вы можете сделать это

SELECT * 
FROM `table` AS a 
WHERE STR_TO_DATE(`date`, '%d/%m/%Y') = (SELECT MIN(STR_TO_DATE(`date`, '%d/%m/%Y')) FROM table AS b WHERE b.user_id = a.user_id AND (criteria_1 = 1 OR criteria_2 = 1)) 
GROUP BY user_id 
1

Это наиболее часто задаваемый вопрос под mysql теге, но эй, это медленный день ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(user_id INT NOT NULL 
,Criterion_1 TINYINT NOT NULL 
,Criterion_2 TINYINT NOT NULL 
,Date DATE NOT NULL 
,PRIMARY KEY(user_id,date) 
); 

INSERT INTO my_table VALUES 
(1,1,1,'2015-01-01'), 
(1,0,1,'2015-01-02'), 
(1,1,0,'2015-01-03'), 
(2,0,0,'2015-01-01'), 
(2,0,1,'2015-01-02'), 
(2,1,0,'2015-01-03'); 

SELECT * FROM my_table; 
+---------+-------------+-------------+------------+ 
| user_id | Criterion_1 | Criterion_2 | Date  | 
+---------+-------------+-------------+------------+ 
|  1 |   1 |   1 | 2015-01-01 | 
|  1 |   0 |   1 | 2015-01-02 | 
|  1 |   1 |   0 | 2015-01-03 | 
|  2 |   0 |   0 | 2015-01-01 | 
|  2 |   0 |   1 | 2015-01-02 | 
|  2 |   1 |   0 | 2015-01-03 | 
+---------+-------------+-------------+------------+ 

SELECT user_id 
    , MIN(date) min_date 
    FROM my_table 
WHERE 1 IN (Criterion_1,Criterion_2) 
GROUP 
    BY user_id; 
+---------+------------+ 
| user_id | min_date | 
+---------+------------+ 
|  1 | 2015-01-01 | 
|  2 | 2015-01-02 | 
+---------+------------+ 

SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT user_id 
      , MIN(date) min_date 
     FROM my_table 
     WHERE 1 IN (Criterion_1,Criterion_2) 
     GROUP 
      BY user_id 
    ) b 
    ON b.user_id = a.user_id 
    AND b.min_date = a.date; 
+---------+-------------+-------------+------------+ 
| user_id | Criterion_1 | Criterion_2 | Date  | 
+---------+-------------+-------------+------------+ 
|  1 |   1 |   1 | 2015-01-01 | 
|  2 |   0 |   1 | 2015-01-02 | 
+---------+-------------+-------------+------------+ 
+0

Я буквально собирался щелкнуть «сообщение» по идентичному вопросу. Спасибо, босс. –