2013-04-24 2 views
0
SELECT o.Date1, o.Date2 
FROM customers AS c, products AS p, products_ids AS pi, orders AS o, temptable AS te 
WHERE p.productid = pi.productidD 
AND pi.prodno = te.prodno 
AND c.custid = o.custid 
AND o.custid = te.custid 
AND te.custid = '24' 
GROUP BY pi.productiD 

Результат запроса возвращается каждый раз в одну и ту же дату (одной строки) ко всем строкам, даже если даты отличаются друг от друга в mysql.Мой запрос возвращает каждый раз то же самое (date2)

+0

. , Вам нужно изучить правильный синтаксис соединения. Когда вы напишете его с помощью 'join', у вас не будет проблемы с неожиданным декартовым продуктом. –

+0

Плейешь кого-нибудь? – marina

+0

@marina Вы не можете видеть комментарий Гордона? –

ответ

1

Как уже было упомянуто, что стоит переход на новую 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.

+0

Большое вам спасибо за все это! я ценю это! – marina

+0

+1. , , Определенно заслуживает повышение. –

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