Проблема с предложением MySQL Group by и Have

Я пытаюсь получить правильные записи, но по какой-то причине у меня возникла проблема с пунктом «Наличие», я думаю, кто-нибудь может мне помочь?

СЛУЧАЙ 1: попытка выбрать строки, где order_id = 1 (новый заказ), но не должно быть более 1 записи с одинаковым идентификатором заказа.

СЛУЧАЙ 2: выберите строки, где order_id = 2 (печатный заказ), но также следует выбрать новые заказы и применить СЛУЧАЙ 1, другими словами, запрос должен выбрать, где order_id=2 ИЛИ где order_id=1, если (order_id = 1, тогда не должно быть более 1 записи с одинаковым идентификатором заказа)

У меня есть таблица, в которой:
order_id = идентификатор заказа
status_id = другой идентификатор статуса, например, 1 = новый, 2 = напечатанный, 3 = в обработке и т. д...
status_change_by = идентификатор администратора, который изменить статус заказа с нового на распечатанный на обработку...

order_id | status_id | status_change_by
1        | 1         | (NULL)
1        | 2         | 12
1        | 3         | 12
2        | 1         | (NULL)
3        | 1         | (NULL)
4        | 1         | (NULL)
1        | 4         | 13
5        | 1         | (NULL)
3        | 2         | (NULL)

Вот мой простой запрос mySQL:

SELECT * from order_tracking
where status_id = 1
group by order_id
having count(order_id) <= 2;

Я даже создал скрипт SQL для справки, проверьте, не ошибаюсь ли я, или мне нужен сложный запрос с операторами CASE или IF?

http://sqlfiddle.com/#!2/16936/3

Если эта ссылка не работает, создайте ее по этому коду:

CREATE TABLE order_tracking 
(
 track_id int auto_increment primary key, 
 order_id int (50), 
 status_id int(20), 
 status_changed_by varchar(30)
);

Вот вставка:

INSERT INTO order_tracking
(order_id, status_id, status_changed_by)
VALUES
(1,1,''),
(1,2,12),
(1,3,12),
(2,1,''),
(3,1,''),
(4,1,''),
(1,4,13),
(5,1,''),
(3,2,'');

Ваш самый ранний ответ должен быть оценен! Спасибо за время.

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

Случай:1, что довольно просто, результат должен быть примерно таким: Только новые заказы с не более чем 1 записью

Order_id | status_id | status_changed_by
2        |  1        | (NULL)
4        |  1        | (NULL)
3        |  1        | (NULL)

Случай 2. Результат:

Order_id | status_id | status_changed_by
1        |  4(max id)| (NULL)
2        |  1        | (NULL)
4        |  1        | (NULL)
3        |  2(max id)| (NULL)

person Nadeem    schedule 08.10.2014    source источник
comment
Пожалуйста, предоставьте желаемые решения на основе ваших образцов данных.   -  person PM 77-1    schedule 09.10.2014
comment
Добавьте желаемые результаты для обоих случаев в свое сообщение (используйте опцию edit).   -  person PM 77-1    schedule 09.10.2014
comment
Обновил, проверьте еще раз.   -  person Nadeem    schedule 09.10.2014
comment
Пожалуйста, просмотрите описания ваших случаев и убедитесь, что вы правильно используете order_id, а не status_id.   -  person PM 77-1    schedule 09.10.2014
comment
Что означает ваш не должно быть более 1 записи с одинаковым идентификатором заказа)? Мы выбираем только один для результата или исключаем такие заказы все вместе?   -  person PM 77-1    schedule 09.10.2014


Ответы (1)


Кажется, читая между строк вашего вопроса, вы хотите отобразить наибольшее числовое значение статуса для каждого идентификатора заказа. То есть кажется, что ваши заказы прогрессируют от статуса 1 до 2, до 3 и так далее.

Вот как вы это делаете. Во-первых, вы определяете самый высокий статус для каждого заказа следующим образом:

    SELECT MAX(status_id) AS status_id, 
           order_id
      FROM order_tracking
     GROUP BY order_id

Этот запрос дает вам одну строку для каждого order_id, показывающую максимальное значение идентификатора статуса.

Затем вы используете его как подзапрос и присоединяетесь к исходной таблице следующим образом. http://sqlfiddle.com/#!2/16936/11/0

SELECT o.order_id, o.status_id, o.status_changed_by
  FROM order_tracking AS o
  JOIN (
        SELECT MAX(status_id) AS status_id, 
               order_id
          FROM order_tracking
         GROUP BY order_id
       ) AS m ON o.order_id = m.order_id AND o.status_id = m.status_id
 ORDER BY o.order_id

Это даст вам хороший результат с самым высоким статусом для каждого заказа.

| ORDER_ID | STATUS_ID | STATUS_CHANGED_BY |
|----------|-----------|-------------------|
|        1 |         4 |                13 |
|        2 |         1 |                   |
|        3 |         2 |                   |
|        4 |         1 |                   |
|        5 |         1 |                   |

Обратите внимание. Если бы вы поместили столбец ID с автоинкрементом в свою таблицу order_tracking, все могло бы работать лучше для вас. Вы сможете получить самый последний статус INSERTed для каждого order_id, а не численно наивысший статус. На мой взгляд, это было бы очень полезным изменением в макете вашей таблицы. Вы бы сделали это так:

SELECT o.order_id, o.status_id, o.status_changed_by
  FROM order_tracking AS o
  JOIN (
        SELECT MAX(id) AS id, 
               order_id
          FROM order_tracking
         GROUP BY order_id
       ) AS m ON o.id = m.id
 ORDER BY o.order_id
person O. Jones    schedule 09.10.2014
comment
Спасибо @Ollie, вы спасаете жизни, также я уже использую auto_increment для tracking_id, еще раз спасибо за ваш вклад и время. - person Nadeem; 09.10.2014