Как уже было упомянуто, что стоит переход на новую ANSI 92 ПРИСОЕДИНЯЙСЯ синтаксис для ясности, это может избежать случайного Перекрестные соединения, поэтому ваш запрос станет:
SELECT o.Date1, o.Date2
FROM customers AS c
INNER JOIN orders AS o
ON c.custid = o.custid
INNER JOIN temptable AS te
o.custid = te.custid
INNER JOIN products AS p
ON pi.prodno = te.prodno
INNER JOIN products_ids AS pi
ON p.productid = pi.productidD
WHERE te.custid = '24'
GROUP BY pi.productiD;
Однако, это не проблема ваш вопрос, проблема в том, что вы злоупотребляете функциональностью в MySql, в которой вы можете выбирать элементы, которые не являются частью группы:
Здесь вы сообщаете запросу, чтобы выбрать 1 строку на отдельное значение для pi.ProductID
, может быть несколько разных значений для o.Date1
и o.Date2
для каждый pi.ProductID
, и вы не даете запросу никаких подсказок относительно того, какую из этих нескольких возможностей выбрать.
Использование столбцов в элементе выбора, не входящих в группу, разрешено стандартами ANSI, но только тогда, когда столбцы в элементе функционально зависят от столбцов внутри группы, это очень трудно придерживаться, поэтому большинство СУБД просто не разрешать столбцы в элементе выбора, которые не находятся в группе.
Продемонстрировать рассматривать этот набор данных (T)
OrderID ProductID Date1 Date2
1 1 20130401 20130402
2 1 20130402 20130403
3 2 20130403 20130404
4 2 20130404 20130405
5 2 20130405 20130406
Если (как в вашем случае) вы сделали:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY ProductID
Вы, вероятно, получите:
OrderID ProductID Date1 Date2
1 1 20130401 20130402
3 2 20130403 20130404
Только принимая первая строка для каждого идентификатора продукта, однако, поскольку запрос не является детерминированным, он был бы одинаково правильным для запроса ret урны последняя строка для каждого продуктаID:
OrderID ProductID Date1 Date2
2 1 20130402 20130403
5 2 20130405 20130406
Это распространенный миф, что добавление порядка поможет это, например.
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY ProductID
ORDER BY OrderID;
MySql определяет строка должна быть возвращена перед нанесением на заказ, так что даже при добавлении ORDER BY OrderID
не гарантирует первый заказ для каждого PRODUCTID возвращается.
MySQL Docs состояния
Сервер может свободно выбрать любое значение из каждой группы, так что, если они не совпадают, значение, выбранное неопределенно. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY.
Наконец, чтобы уточнить, что я говорил о функционально зависимых столбцов, потому что в этом наборе данных OrderID
является первичным ключом, в соответствии со стандартами ANSI вы могли бы написать:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY OrderID;
Таким образом, в то время как я на самом деле не ответил ваш вопрос, надеюсь, показал, где вы ошибаетесь.Вам действительно нужно установить, чего вы пытаетесь достичь группой, и если у вас все еще нет решения, я бы предложил новый, более конструктивный вопрос, с образцами данных и ожидаемым результатом с четкими правилами относительно почему expexted output expexted.
. , Вам нужно изучить правильный синтаксис соединения. Когда вы напишете его с помощью 'join', у вас не будет проблемы с неожиданным декартовым продуктом. –
Плейешь кого-нибудь? – marina
@marina Вы не можете видеть комментарий Гордона? –