Выберите запрос с MAX - PullRequest
       6

Выберите запрос с MAX

2 голосов
/ 09 февраля 2010

У меня большая проблема, и я пробовал весь день, и не нашел никакого решения. Надеюсь, ты сможешь мне помочь?

У меня есть две таблицы:

Первый из них называется "заказы":

orders_id | orders_date | .....
1           xxxxxxxxxx
2           xxxxxxxxxx
3           xxxxxxxxxx

Вторым является "orders_history":

orders_id | order_status_id | date_added
1           1                 2009-10-01
1           2                 2010-01-01
2           1                 2010-02-01
3           1                 2010-02-01

Так что теперь я хочу, чтобы все ордера были где order_status_id = '1'

Я пробовал с MAX, HAVING, GROUP BY, ... также выбирает подвыборы, но я не нашел решения. Я знаю, что это не очень сложно, но я закончил ... Это что-то вроде:

SELECT orders.*, orders_history.* FROM orders, orders_history WHERE orders_history.order_status_id <= '1'

Но тогда я также получаю Order с order_id 1

Надеюсь, вы сможете помочь. Спасибо!

Sascha

Чтобы уточнить, таблица автора orders_history отслеживает состояние всех заказов с течением времени. Цель - запрос, который найдет все заказы, которые в настоящее время имеют статус заказа 1. Идентификатор заказа № 1 в настоящее время имеет статус 2, поэтому его не следует включать в результаты.

Предположительно, статус заказа со временем повышается и никогда не понижается, так что статус заказа и date_added будут постоянно увеличиваться.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2010

Это должно сделать это для вас:

SELECT * 
FROM orders
   , orders_history
WHERE orders.orders_id = orders_history.orders_id
AND orders.orders_id IN (
  SELECT orders_id 
    FROM orders_history
   GROUP BY orders_id
   HAVING MAX(order_status_id) = 1
)
2 голосов
/ 09 февраля 2010

Я не удивлен, что у вас возникли проблемы с тем, чтобы заставить это работать - это очень сложный тип запроса, в котором вы должны 'GROUP BY' и найти MAX, а также все другие соответствующие значения в той же строке. Это распространенный запрос, и он часто удивляет людей тем, что на самом деле довольно сложно выразить это в SQL. Вот один из способов сделать это в MySQL:

SELECT T2.orders_id FROM (
    SELECT orders_id, MAX(date_added) AS date_added
    FROM orders_history
    GROUP BY orders_id
) AS T1
JOIN orders_history T2
ON T1.orders_id = T2.orders_id AND T1.date_added = T2.date_added
GROUP BY T2.orders_id, T2.date_added
HAVING MAX(order_status_id) = 1

Здесь я предполагаю, что:

  • orders_id, date_added не является уникальным.
  • orders_id, date_added, order_status_id уникален.

Если второе предположение не соответствует действительности, добавьте DISTINCT после первого SELECT.

Вот результаты, полученные для ваших тестовых данных:

2
3

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

1 голос
/ 09 февраля 2010

Отредактировано после обсуждения в комментариях (изменено предложение where):

SELECT orders.*, orders_history.* 
FROM orders INNER JOIN orders_history
 ON orders.orders_id = orders_history.orders_id 
WHERE orders.orders_id IN 
   (SELECT orders_id FROM orders_history 
   GROUP BY orders_id 
   HAVING MAX(order_status_id) = 1)
0 голосов
/ 09 февраля 2010
select o.*, oh.* 
from orders o
inner join orders_history oh on oh.orders_id = o.orders_id
where oh_orders_status = 1

должен сделать свое дело. Хотя прошло некоторое время с тех пор, как я коснулся mysql, поэтому я не знаю, должен ли ваш orders_status быть в кавычках - я бы не подумал, что это int ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...