2015-06-10 4 views
1

У меня проблема ...
У меня есть один запрос, но каждый раз, когда я обновляю запрос, результат изменяется.
Вот мой запросГруппа MySQL По запросу производит неопределенные результаты

SELECT `t`.*, COUNT('ID') AS `tr` FROM (
    SELECT * FROM HISTORY WHERE USER_ID = 1 AND BIEN_ID IS NOT NULL 
    ORDER BY CREATED_AT DESC) AS `t` WHERE (`USER_ID` = 1) 
    GROUP BY `t`.`BIEN_ID` ORDER BY `t`.`CREATED_AT` DESC 

Я на самом деле хочу группе BIEN_ID с последним CREATED_AT поле
ли кто-то может мне помочь?

К примеру, первый раз, когда я получил это:

ID |USER_ID| BIEN_ID | CREATED_AT 
205 | 1 |  36 | 2015-06-10 17:00:36 
203 | 1 |  48 | 2015-06-10 17:00:2 

И после того, как я получил это:

ID | USER_ID| BIEN_ID | CREATED_AT 
202 | 1  | 7  | 2015-06-10 16:31:48 
196 | 1  | 48  | 2015-06-10 16:23:4 

Вот моя история DB:

ID | USER_ID| BIEN_ID | CREATED_AT 
202 | 1  | 7  | 2015-06-10 16:31:48 
199 | 1  | 48  | 2015-06-10 16:23:40 
196 | 1  | 48  | 2015-06-09 16:23:31 
140 | 1  | 7  | 2015-06-09 10:01:20 
134 | 1  | 30  | 2015-06-04 09:10:11 
100 | 1  | 48  | 2015-06-01 11:32:40 

И вот что я ожидаю (хочу GROUP BY ID, COUNT тот же BIEN_ID, и получить самую последнюю created_at)

ID | USER_ID| BIEN_ID | COUNT | CREATED_AT 
202 | 1  | 7  | 2  | 2015-06-10 16:31:48 
199 | 1  | 48  | 3  | 2015-06-10 16:23:40 
134 | 1  | 30  | 1  | 2015-06-04 09:10:11 
+0

Пожалуйста, дайте пример того, как результаты меняются. –

+0

'140 | 1 | 30 | 1 | 2015-06-04 09: 10: 11 это может быть '134 | 1 | 30 | 1 | 2015-06-04 09: 10: 11'? N где user_id всегда равно 1? –

+0

@NagendraNigade Да, мое плохое, вы правы, это 134 –

ответ

4

Это слишком долго для комментария.

Вы используете расширение для MySQL GROUP BY, который явноdocumented возвращать неопределенные результаты. Следовательно, вы не должны удивляться тому, что вы получаете, ну, неопределенные результаты.

Проблема в том, что вы делаете select * в запросе group by. Столбец group by: t.bien_id - Я угадываю из контекста, что это не уникальный идентификатор для каждой строки. (Если это так, граф всегда будет 1, и запрос будет работать последовательно от выполнения в перспективе.)

Конкретная документация:

MySQL расширяет использование GROUP BY так, чтобы выбрать список могут ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY. Это означает , что предыдущий запрос является законным в MySQL. Вы можете использовать эту функцию , чтобы получить лучшую производительность, избегая ненужной сортировки столбцов и группировки . Однако это полезно, прежде всего, когда все значения в каждом неагрегантном столбце , не названные в GROUP BY, одинаковы для каждой группы . Сервер может выбирать любое значение из каждой группы, поэтому , если они не совпадают, выбранные значения являются неопределенными.

+0

Вы правы в этом слишком долго для комментария, но он объясняет проблема в том, что если OP настраивает свой запрос только для выбора столбцов, которые являются согласованными в каждой группе, то это может сработать, исправить? Конечно, могут быть и другие факторы, но мне сложно говорить. – AdamMc331

+0

@ McAdam331 В теории. Фактически, ОП должен просто задать другой вопрос с образцами данных и желаемыми результатами.Он должен сосредоточиться на том, что его хочет выполнить, а не спрашивать, почему неправильный запрос дает неопределенные результаты.Есть решение проблемы, и он не похож на вопрос в вопросе. –

+0

@GordonLinoff Спасибо. Я отредактировал мой вопрос, с waht, которого я действительно хочу. Я все еще не понимаю, как это сделать в одном запросе ... –

1
select a.id,a.user_id,a.bien_id,a.created_at,b.TOTAL_OCCURANCES from (select * 
from temp1 where created_at in (select MAX(created_at) from temp1 group by 
BIEN_ID))a , (select count(*) as TOTAL_OCCURANCES,BIEN_ID from temp1 group by 
BIEN_ID) b where a.BIEN_ID=b.BIEN_ID order by CREATED_AT desc; 

Это будет прекрасно работать, как вы ожидали.

Fiddle: http://www.sqlfiddle.com/#!9/f3e43/22/3

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