Повторяющиеся строки Sql-запроса

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

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 = Пол (обычно покупатель) и 5 ​​= compny1 (обычно продавец) ПРИМЕЧАНИЕ: идентификатор продукта 1 = яблоко, идентификатор продукта 2 = груша, идентификатор продукта 3 = ягоды, идентификатор продукта 4 =оранжевый

Таблица Request выглядит следующим образом после выбора записей MatchType=Price и cust 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

ПОСЛЕ ВЫПОЛНЕНИЯ ЗАПРОСА Я ПРОБОВАЛ ОБА ПРЕДЛАГАЕМЫЕ ОБЪЕДИНЕНИЯ И ОДИН В ЭТОМ ВОПРОСЕ, Я ПРОДОЛЖАЮ ПОЛУЧАТЬ ЭТО КАК ВЫХОД

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

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

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

    7          3            1            10.0    7.00        price  

person johnny    schedule 17.02.2013    source источник
comment
Возможно, эти продукты имеют несколько совпадений в requests.   -  person Martin Smith    schedule 18.02.2013
comment
Когда вы выполняете соединение, отображается каждая соединяющаяся пара, поэтому, если вы соедините таблицу с одной записью и таблицу, внешний ключ которой находится в 10 строках, то ответ будет иметь 10 строк.   -  person Boris the Spider    schedule 18.02.2013
comment
@MartinSmith таблица запросов с идентификатором клиента 3 показывает запросы на следующее: шоколад, 2 кг, 2,00 шоколада, 10 кг, 8,00 сладостей, 3 кг, 3,00, это продукты, запрошенные пользователем 3.... Есть два поставщика, которые продают шоколад и сладости... 1 поставщик, а именно compny1 продает только один шоколадный продукт.. другой поставщик daz продает оба. Я просто не понимаю, почему последние 4 строки повторяются?   -  person johnny    schedule 18.02.2013
comment
@bmorris591 bmorris591 что я могу сделать, чтобы не показывать эти повторяющиеся строки? Могу ли я как-то использовать DISTINCT?›   -  person johnny    schedule 18.02.2013
comment
Я бы посоветовал вам перейти на sqlfiddle.com и создать схему и некоторые образцы данных. А затем используйте это, чтобы описать, какой результат вы ищете. Это позволит людям легко дать вам результаты, которые вы ищете.   -  person jmoreno    schedule 18.02.2013
comment
@jmoreno Действительно, я сделаю все возможное, чтобы показать вам, ребята, завтра первым делом, а затем опубликовать это. Спасибо за совет:)   -  person johnny    schedule 18.02.2013


Ответы (2)


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

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

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

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

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

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
person Evyatar Nezer    schedule 17.02.2013
comment
Кажется, это возвращает тот же результат, что и мины :( 2 записи все еще повторяются :( - person johnny; 18.02.2013
comment
Сначала вы можете добавить отличные друг от друга после выбора, но это не решит проблему полностью ... это просто обходной путь ... что вы пытаетесь спросить в этом запросе? - person Evyatar Nezer; 18.02.2013
comment
вау, да, это обходной путь ... Хорошо, вся цель моего вопроса в том, что у меня есть небольшая проблема. Если вас это устраивает, я задал вопрос более подробно здесь: ссылка, а также здесь [ссылка]stackoverflow.com/questions/14915675/ Вы можете прочитать первую ссылку, а затем вторую, если хотите. Я так застрял с этой проблемой, потратил на нее 2 дня, и я вообще не могу понять это :( - person johnny; 18.02.2013
comment
Я собираюсь пойти спать сейчас (голова и глаза убивают, лол!), но если бы вы могли оказать какую-либо помощь, я был бы очень благодарен. - person johnny; 18.02.2013
comment
Я прочитал проблему, которую вы описали.. она не совсем маленькая, но прежде всего.. Я думаю, что позиционирование соединений необходимо изменить. я собираюсь изменить запрос еще раз, но я изменю порядок внутренних соединений ... так что порядок фильтрации будет другим, проверьте это утром ... спокойной ночи. - person Evyatar Nezer; 18.02.2013
comment
в этот час я не уверен, решит ли это проблему, но проверьте это на следующий день и скажите мне, что происходит, если проблема не исчезнет, ​​​​я попытаюсь создать небольшую базу данных с вашим примером на моей машине и проверить это до дна.. - person Evyatar Nezer; 18.02.2013
comment
Я отредактировал вопрос, показывающий, как выглядят мои таблицы. Кажется, что строки все еще повторяются... :( если я не использую DISTINCT - person johnny; 18.02.2013
comment
Итак, я думаю, что мое редактирование объясняет, почему строка повторяется, потому что один и тот же клиент дважды запрашивал продукт с разными количествами. Таким образом, он неизбежно совпадет с ним один раз для первого запроса (1) и снова для второго раза (requestid = 7)... Однако есть ли способ, если клиент размещает заказ дважды, тогда он отображает совпадения только один раз ? Думаю, мне придется использовать отличное право? - person johnny; 19.02.2013
comment
Эй, Джонни, я создал описанную базу данных на своем компьютере ... и я прочитал то, что вы написали ранее (и обновленный вопрос). как насчет добавления where для каждого запроса .. что означает, где request.demandid = 1? и это устранит другие или добавит к выбору поле request.demandid, а затем сделает заказ по request.demandid, s.Price asc... чтобы вы точно увидели, что видите разные строки... - person Evyatar Nezer; 19.02.2013
comment
Я не могу отблагодарить вас за помощь, которую вы мне оказываете. Не могли бы вы взглянуть на этот сообщение номер 5 по адресу ссылка, тогда вы сможете полностью понять, чего я пытаюсь достичь... Требуемый идентификатор является первичным ключом для дифференциации различных запросов. .. Проблема в том, что пользователь входит на сайт php, а затем, поскольку этот пользователь будет делать разные запросы на спрос, как он будет обновляться автоматически. Я имею в виду, что мой полный вопрос, как я уже сказал, можно увидеть на - person johnny; 19.02.2013
comment
сайт, который я указал по ссылке. Я был бы очень признателен, если бы вы могли помочь мне в этом... - person johnny; 19.02.2013

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

person Just Aguy    schedule 17.02.2013
comment
Спасибо за ваш ответ. Я пробовал это, и все же строки повторяются. Я отредактировал вопрос, показывающий, как выглядят мои таблицы. Если это поможет объяснить, почему? - person johnny; 18.02.2013
comment
как я сказал предыдущему комментатору для ответа ... хорошо, поэтому я думаю, что мое редактирование объясняет, почему строка повторялась, потому что один и тот же клиент дважды запрашивал продукт с разными количествами. Таким образом, он неизбежно совпадет с ним один раз для первого запроса (1) и снова для второго раза (requestid = 7)... Однако есть ли способ, если клиент размещает заказ дважды, тогда он отображает совпадения только один раз ? Думаю, мне придется использовать отличное право? - person johnny; 19.02.2013
comment
Мой вопрос: почему вы хотите скрыть активный заказ клиента? В приложении должны быть некоторые ключевые ограничения или код, предотвращающий дублирование записей. Помните, что ваша база данных опирается на эти виды сдержек и противовесов для обеспечения целостности данных. Без них ваша БД будет раздута мусорными данными, и вы никогда не узнаете, какой из них является фактическим запросом, а какой нет. - person Just Aguy; 19.02.2013
comment
Да я с вами полностью согласен. Я понял, в чем дело. Вы правы в том смысле, что мне нужно поставить чек, чтобы один и тот же клиент не вводил ТОЧНО одни и те же суммы и количества дважды. Теоретически я этого не скрываю, но я видел, в чем была моя вина. Это было связано с тем, что если один и тот же клиент запросил, скажем, яблоки, то он будет показывать одного и того же поставщика дважды: один раз для яблока, запрошенного в первый раз, а затем снова для второго сделанного запроса. Следовательно, ряды повторялись. Теперь у меня есть следующая проблема, которую нужно решить. - person johnny; 19.02.2013
comment
Если вы хотите, я был бы очень признателен, если бы вы могли взглянуть на ссылка, так как это моя основная проблема, с которой я сталкиваюсь. Если вы посмотрите на сообщение номер 5, которое я сделал. Как я уже сказал, любая помощь или совет будут очень полезны. - person johnny; 19.02.2013
comment
Вам нужно действительно изучить дублирующую проблему. Почему? Что, если у клиента есть два законных запроса на одно и то же количество и одинаковую сумму? Это разрешено вашими бизнес-правилами? Я был бы рад проконсультировать вас в автономном режиме, вы можете написать мне? И пришлите другую ссылку, они переместили ваш пост, на который вы ссылались. - person Just Aguy; 21.02.2013