2013-02-17 3 views
1

Я запускаю запрос, и я получаю дублированные строки. Я не понимаю, почему это так. Вот мой запрос:Повторяющиеся строки Sql Query

SELECT c.FName, 
     p.ProductName, 
     s.Description, 
     s.Quantity, 
     s.Price 
FROM customers c, 
     products p, 
     sellers s, 
     requests r 
WHERE c.ID = s.CID 
     AND p.ProductID = s.ProductID 
     AND r.ProductID = s.ProductID 
     AND r.C_ID = 3 
     AND r.MatchType = 'Price' 
ORDER BY s.Price ASC 

======= ======= редактировать

Хорошо здесь правку, что значения в таблице запросов выглядит. ПРИМЕЧАНИЕ: CID 2 = DAZ (обычно продавец), 3 = Paul (обычно покупают парень) и 5 ​​= compny1 (обычно продавец) ПРИМЕЧАНИЕ: идентификатор продукта 1 = яблоко, товар id 2 = груша, productid 3 = ягоды, продукт id4 = оранжевый

таблица запроса выглядит следующим образом после выбора записи MatchType = Цена и каст ID = 3:

requestid | cid | productid | Quantity | Price | matchtype 
    ------------------------------------------------------------------ 
    1   3   1   3.0  2.00  price 
    3   3   4   4.0  2.50  price 
    4   3   3   2.5  2.00  exact 
    5   3   2   3.0  3.50  exact 
    6   3   3   3.0  2.00  exact 
    7   3   1   10.0 7.00  price 

и вот таблица продавцов

promotionID | cid | productid | Quantity | Price | description 
    ------------------------------------------------------------------ 
    1   2   4   5.0  2.99  oranges 
    2   2   3   1.5  1.00  hand strawberries   
    3   2   3   2.5  2.00  l stawberries 
    4   2   2   3.0  3.00  pear  
    5   5   1   5.0  5.00  royal apples fm appleco.   
    6   2   1   6.0  5.50   sweet apples 

пОСЛЕ выполнения запроса I УДАЛИТЬ ОБА ПРЕДЛАГАЕМЫЕ СОБЫТИЯ И ОДИН В ЭТОМ ВОПРОСЕ Я ХОЧУ ПОЛУЧИТЬ Т HIS AS OUTPUT

FName ProductName   Description   Quantity Price 

daz   Oranges  Fresh and sweet oranges. 5.0  2.99 
compny1  Apple  royal apples fm appleco. 5.0  5.00 
compny1  Apple  royal apples fm appleco. 5.0  5.00 
daz   Apple  sweet apples     6.0  5.50 
daz   Apple  sweet apples     6.0  5.50 

Я не понимаю, почему я ПОЛУЧАТЬ строки, повторяющиеся. Идентификатор запрашиваемого продукта должен быть = идентификатор продукта продавцов для соответствия запрошенным продуктам доступным продуктам, а выбранный в этом случае клиент - это 3 ...

Я не понимаю, почему последние 4 записи повторяют их сами? Почему это может быть?
С технической точки зрения должно отображаться только 4 записи. т.е. записи по строкам .. 1,2 и 3

ПРЕДЛОЖЕНИЕ/НАБЛЮДЕНИЕ OKay, посмотрев на это ... Как вы думаете, строки повторяются, потому что productID1 = apple был запрошен одним и тем же клиентом дважды с разные количества ???

requestid | cid | productid | Quantity | Price | matchtype 
     ------------------------------------------------------------------ 
    1   3   1   3.0  2.00  price 

    7   3   1   10.0 7.00  price 
+0

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

+0

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

+0

@MartinSmith также таблица запроса с идентификатором клиента 3 показывает запросы на следующее: шоколада, 2 кг, 2,00 Choclate, 10 кг, 8.00 сладости, 3KG, 3,00 они являются продуктами, запрашиваемого пользователем 3 .... Есть два поставщика, которые продают холат и сладости ... 1 поставщик именно compny1 продает только один продукт choclate .. другой поставщик daz продает оба. Я просто не понимаю, почему последние 4 строки повторяют их сами? – johnny

ответ

1

Вам необходимо использовать внутреннее соединение для «фильтрации» строк. попробовать это:

select c.FName, p.ProductName, s.Description, s.Quantity, s.Price 
FROM requests r 
inner join sellers s on r.ProductID = s.ProductID 
inner join products p on p.ProductID=s.ProductID 
inner join customers c on c.ID=s.CID  
where r.C_ID = 3 AND r.MatchType='Price' 
ORDER BY s.Price ASC 

надежду на то, что у меня нет никакой ошибки здесь (его поздно здесь), но его основная идея. для столбцов, которые существуют в двух таблицах, и вы хотите использовать для фильтрации использовать внутреннее соединение, для фильтрации из одной таблицы используйте были пункт .. (что теория на одной ноге) ...

--- редактировать ----

этот запрос может показать робость между запросами ...

select c.FName, p.ProductName, s.Description, s.Quantity, s.Price, r.demandid as 'Request ID' 
FROM requests r 
inner join sellers s on r.ProductID = s.ProductID 
inner join products p on p.ProductID=s.ProductID 
inner join customers c on c.ID=s.CID  
where r.C_ID = 3 AND r.MatchType='Price' 
ORDER BY r.demandid s.Price ASC 
+0

Это, похоже, возвращает тот же результат, что и мины :(2 записи по-прежнему повторяются :( – johnny

+0

Сначала вы можете добавить отдельные после выбора, но это не «решит» проблему полностью .. ее просто работайте вокруг .. что вы пытаетесь спросить в этом запросе? –

+0

wow да, это работа вокруг ... Хорошо, вся цель, которую я задаю, это потому, что у меня небольшая проблема. Если это нормально для вас, я спросил вопрос более подробно здесь: [ссылка] (http://forums.devshed.com/mysql-help-4/mysql-help-fulfil-customer-requests-940049.html#post2856610) а также здесь [ ссылка] http://stackoverflow.com/questions/14915675/fulfilling-quantity-required-using-mysql Вы можете прочитать первую ссылку, а затем вторую, если хотите. Я так застрял в этой проблеме, потраченной на 2 дня ays на нем, и я не могу понять это вообще :( – johnny

0
select c.FName, p.Name, s.Description, s.Quantity, s.Price 
FROM customers c 
left join sellers s on c.ID = s.cid 
left join requests r on r.ProductID = s.ProductID 
left join products p on p.productid = s.productid 
where r.C_ID = 1 
AND r.MatchType='Price' 
ORDER BY s.Price ASC 

я настроить скрипку для него SQL Fiddle и подбросил фиктивных данных. код работает, если я правильно настройте данные.

+0

Спасибо за ваш ответ. Я пробовал это, и все еще строки повторяются. Я редактировал вопрос, показывающий, как выглядят мои таблицы. Если это поможет объяснить, почему? – johnny

+0

как я сказал предыдущему комментатору для ответа. Хорошо, поэтому я думаю, что мое редактирование объясняет, почему строка повторяла его, потому что тот же клиент дважды запрашивал продукт с разными количествами. Таким образом, неизбежность будет соответствовать ему один раз для первого запроса (1) и снова во второй раз (requestid = 7) ... Есть ли способ, однако, если клиент делает заказ дважды, тогда он отображает только совпадения ? Наверное, мне нужно было бы использовать разные права? – johnny

+0

Мой вопрос: почему вы хотите скрыть активный заказ от клиента? В приложении должны быть некоторые ключевые ограничения или код, который предотвращает дублирование записей. Помните, что ваша база данных использует эти виды сдержек и противовесов для целостности данных. Без них ваш db будет раздуваться с данными мусора, и вы никогда не узнаете, какой из них является фактическим запросом, а какой нет. –

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