2015-10-31 28 views
0

我需要一些查詢幫助。需要幫助以獲得精確的MYSQL查詢

首先,這裏的表:

-- 
-- Create table produit 
-- 

CREATE TABLE produit (
    ref_prod integer primary key, 
    name_prod text not null, 
    color text , 
    weight integer 
); 

-- 
-- Create table factory 
-- 

CREATE TABLE factory (
    ref_factory integer primary key, 
    name_factory text not null, 
    city text not null 
); 

-- 
-- Create table shop 
-- 

CREATE TABLE shop (
    ref_shop integer primary key, 
    name_shop text not null, 
    city text not null 
); 

-- 
-- Create table provenance 
-- 

CREATE TABLE provenance (
    ref_prod integer, 
    ref_factory integer, 
    ref_shop integer, 
    quantity integer, 
    constraint cle_prim primary key (ref_prod, ref_factory, ref_shop) 
); 

-- 
-- Data for Name: shop 
-- 

INSERT INTO shop (ref_shop, name_shop, city) VALUES (14, 'Stock10', 'Paris'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (16, 'JaiTout', 'Marseille'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (18, 'EnGros', 'Bordeaux'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (20, 'PrixBas', 'Toulouse'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (22, 'BasPrix', 'Marseille'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (24, 'DuBon', 'Lyon'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (26, 'DuBeau', 'Toulouse'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (28, 'BasDeGamme', 'Dublin'); 
INSERT INTO shop (ref_shop, name_shop, city) VALUES (30, 'PasCher', 'Lyon'); 


-- 
-- Data for Name: produit 
-- 

INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (1, 'tabouret', 'rouge', 5); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (2, 'evier', 'bleu', 65); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (3, 'bureau', 'jaune', 45); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (4, 'lampe a petrole', 'vert', 15); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (5, 'ordinateur', 'rouge', 10); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (6, 'telephone', 'bleu', 8); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (7, 'tabouret', 'violet', 1); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (8, 'evier', 'bleu', 65); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (9, 'tabouret', 'orange', 3); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (10, 'lampe halogene', 'rose', 11); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (11, 'lampe a souder', 'noir', 3); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (12, 'telephone', 'bleu', 2); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (13, 'casse-noix', 'vert', 1); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (14, 'casse-pied', 'marron', 55); 
INSERT INTO produit (ref_prod, name_prod, color, weight) VALUES (15, 'casse-oreille', 'violet', 15); 

INSERT INTO produit (ref_prod, name_prod, weight) VALUES (16, 'casserole', 'bleu'); 
INSERT INTO produit (ref_prod, name_prod, weight) VALUES (17, 'bottes', 'rouge'); 
INSERT INTO produit (ref_prod, name_prod) VALUES (18, 'lampe halogene'); 
INSERT INTO produit (ref_prod, name_prod, weight, weight) VALUES (19, 'table', 'rouge', 10); 
INSERT INTO produit (ref_prod, name_prod, weight) VALUES (20, 'telephone', 3); 
INSERT INTO produit (ref_prod, name_prod, weight, weight) VALUES (21, 'evier', 'bleu', 65); 
INSERT INTO produit (ref_prod, name_prod, weight) VALUES (22, 'evier', 105); 
INSERT INTO produit (ref_prod, name_prod, weight) VALUES (23, 'evier', 115); 


-- 
-- Data for Name: provenance 
-- 

INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (1, 109, 14, 80); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (1, 109, 16, 100); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (1, 302, 16, 213); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (2, 189, 30, 213); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (3, 402, 14, 315); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (4, 200, 18, 985); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (5, 302, 20, 858); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (6, 213, 16, 315); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (6, 109, 22, 458); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (7, 109, 16, 213); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (8, 302, 16, 2000); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (9, 189, 30, 175); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (10, 402, 14, 100); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (11, 109, 16, 750); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (11, 302, 16, 100); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (12, 189, 30, 315); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (12, 200, 16, 589); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (12, 189, 22, 213); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (13, 402, 14, 499); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (14, 109, 18, 213); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (15, 189, 20, 1958); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (15, 189, 16, 333); 

INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (16, 302, 14, 49); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (17, 109, 18, 213); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (16, 189, 20, 18); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (16, 213, 16, 33); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (18, 200, 18, 187); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (18, 302, 16, 88); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (18, 213, 14, 315); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (20, 109, 22, 458); 
INSERT INTO provenance (ref_prod, ref_factory, ref_shop, quantity) VALUES (20, 402, 14, 13); 


-- 
-- Data for Name: factory 
-- 

INSERT INTO factory (ref_factory, name_factory, city) VALUES (109, 'martin', 'Nantes'); 
INSERT INTO factory (ref_factory, name_factory, city) VALUES (189, 'leroux', 'Marseille'); 
INSERT INTO factory (ref_factory, name_factory, city) VALUES (213, 'dupont', 'Bordeaux'); 
INSERT INTO factory (ref_factory, name_factory, city) VALUES (402, 'peugeot', 'Toulouse'); 
INSERT INTO factory (ref_factory, name_factory, city) VALUES (200, 'peugeot', 'Marseille'); 
INSERT INTO factory (ref_factory, name_factory, city) VALUES (302, 'rover', 'Londres'); 



-- 
-- Name: provenance_ref_shop_fkey; Type: FK CONSTRAINT; 
-- 

ALTER TABLE provenance 
    ADD CONSTRAINT provenance_ref_shop_fkey FOREIGN KEY (ref_shop) REFERENCES shop(ref_shop); 


-- 
-- Name: provenance_ref_prod_fkey; Type: FK CONSTRAINT; 
-- 

ALTER TABLE provenance 
    ADD CONSTRAINT provenance_ref_prod_fkey FOREIGN KEY (ref_prod) REFERENCES produit(ref_prod); 


-- 
-- Name: provenance_ref_factory_fkey; Type: FK CONSTRAINT; 
-- 

ALTER TABLE provenance 
    ADD CONSTRAINT provenance_ref_factory_fkey FOREIGN KEY (ref_factory) REFERENCES factory(ref_factory); 

我需要一個查詢至極得到(X,Y)店的引用至極由同一工廠生產同一產品的供應。 我只能使用SELECT,WHERE和HAVING。

我開始喜歡的東西:

SELECT shop.ref_shop AS "shop1",shop.ref_shop AS "shop2" 
FROM shop, 
    factory, 
    provenance, 
    produit 
WHERE shop.ref_shop=provenance.ref_shop 
    AND produit.ref_prod=provenance.ref_prod 
    AND factory.ref_factory=provenance.ref_factory 
    AND shop1<>shop2 

,但我不知道怎麼只有店裏的引用至極由同一工廠和它的外觀一樣的別名不與工作中取得的同一產品的供應哪裏。 感謝您的幫助。

+1

請給出一些輸入和預期輸出的例子。 – Tomas

回答

0

produit表的模式本身是錯誤的。列名在表中必須是唯一的。

你可以很可能創造這樣

CREATE TABLE produit (
ref_prod integer primary key, 
name_prod text not null, 
weight_text text, 
weight_int integer 
); 

insert語句將需要相應地改變,例如

INSERT INTO produit (ref_prod, name_prod, weight_text, weight_int) VALUES (12, 'telephone', 'bleu', 2); 

我需要一個查詢至極得到(X,Y)店的引用這些產品由同一家工廠生產的相同產品提供。我只能使用SELECT,WHERE和HAVING。

重要的是,您首先嚐試編寫查詢,然後向任何問題尋求幫助。

更新:

不能使用where子句中混淆的名稱。應改爲使用列名shop.ref_shop

另外,你爲什麼選擇同一列兩次?

「」

不在SELECT shop.ref_shop AS "shop1",shop.ref_shop AS "shop2"必要的別名沒有空間。

提供您希望查詢返回的一些示例輸出數據。的請求與produit「矮凳」關係的商店和工廠

+0

你是對的,我搞砸了produit。我用正確的模式編輯問題並在最後添加我的嘗試。 – FPSedin

+0

Produit的插入代碼仍然顯示重複的列名稱。您在運行SELECT時獲得的輸出是什麼? –

+0

「'where子句'中的未知列'shop1' – FPSedin

0

例子「馬丁」

SELECT distinct 
     shop.name_shop, produit.name_prod, factory.name_factory 
    FROM 
     shop, 
     provenance, 
     factory, 
     produit 
    WHERE 
     shop.ref_shop = provenance.ref_shop 
      AND factory.ref_factory = provenance.ref_factory 
      AND produit.ref_prod = provenance.ref_prod 
      AND produit.name_prod = 'tabouret' 
      AND factory.name_factory = 'martin'; 
0

我真的不知道你後的東西,但這裏有一個基本的查詢來獲取所有的數據(忽略NULL值)。您應該可以根據您的需要修改它...

 SELECT s.ref_shop 
      , s.name_shop 
      , s.city shop_city 
      , v.ref_prod 
      , v.ref_factory 
      , v.quantity 
      , p.name_prod 
      , p.color 
      , p.weight 
      , f.name_factory 
      , f.city factory_city 
     FROM shop s 
     JOIN provenance v 
      ON v.ref_shop = s.ref_shop 
     JOIN produit p 
      ON p.ref_prod = v.ref_prod 
     JOIN factory f 
      ON f.ref_factory = v.ref_factory; 

+----------+-----------+-----------+----------+-------------+----------+-----------------+--------+--------+--------------+--------------+ 
| ref_shop | name_shop | shop_city | ref_prod | ref_factory | quantity | name_prod  | color | weight | name_factory | factory_city | 
+----------+-----------+-----------+----------+-------------+----------+-----------------+--------+--------+--------------+--------------+ 
|  14 | Stock10 | Paris  |  1 |   109 |  80 | tabouret  | rouge |  5 | martin  | Nantes  | 
|  16 | JaiTout | Marseille |  1 |   109 |  100 | tabouret  | rouge |  5 | martin  | Nantes  | 
|  22 | BasPrix | Marseille |  6 |   109 |  458 | telephone  | bleu |  8 | martin  | Nantes  | 
|  16 | JaiTout | Marseille |  7 |   109 |  213 | tabouret  | violet |  1 | martin  | Nantes  | 
|  16 | JaiTout | Marseille |  11 |   109 |  750 | lampe a souder | noir |  3 | martin  | Nantes  | 
|  18 | EnGros | Bordeaux |  14 |   109 |  213 | casse-pied  | marron |  55 | martin  | Nantes  | 
|  18 | EnGros | Bordeaux |  17 |   109 |  213 | bottes   | NULL |  0 | martin  | Nantes  | 
|  22 | BasPrix | Marseille |  20 |   109 |  458 | telephone  | NULL |  3 | martin  | Nantes  | 
|  30 | PasCher | Lyon  |  2 |   189 |  213 | evier   | bleu |  65 | leroux  | Marseille | 
|  30 | PasCher | Lyon  |  9 |   189 |  175 | tabouret  | orange |  3 | leroux  | Marseille | 
|  22 | BasPrix | Marseille |  12 |   189 |  213 | telephone  | bleu |  2 | leroux  | Marseille | 
|  30 | PasCher | Lyon  |  12 |   189 |  315 | telephone  | bleu |  2 | leroux  | Marseille | 
|  16 | JaiTout | Marseille |  15 |   189 |  333 | casse-oreille | violet |  15 | leroux  | Marseille | 
|  20 | PrixBas | Toulouse |  15 |   189 |  1958 | casse-oreille | violet |  15 | leroux  | Marseille | 
|  20 | PrixBas | Toulouse |  16 |   189 |  18 | casserole  | NULL |  0 | leroux  | Marseille | 
|  18 | EnGros | Bordeaux |  4 |   200 |  985 | lampe a petrole | vert |  15 | peugeot  | Marseille | 
|  16 | JaiTout | Marseille |  12 |   200 |  589 | telephone  | bleu |  2 | peugeot  | Marseille | 
|  18 | EnGros | Bordeaux |  18 |   200 |  187 | lampe halogene | NULL | NULL | peugeot  | Marseille | 
|  16 | JaiTout | Marseille |  6 |   213 |  315 | telephone  | bleu |  8 | dupont  | Bordeaux  | 
|  16 | JaiTout | Marseille |  16 |   213 |  33 | casserole  | NULL |  0 | dupont  | Bordeaux  | 
|  14 | Stock10 | Paris  |  18 |   213 |  315 | lampe halogene | NULL | NULL | dupont  | Bordeaux  | 
|  16 | JaiTout | Marseille |  1 |   302 |  213 | tabouret  | rouge |  5 | rover  | Londres  | 
|  20 | PrixBas | Toulouse |  5 |   302 |  858 | ordinateur  | rouge |  10 | rover  | Londres  | 
|  16 | JaiTout | Marseille |  8 |   302 |  2000 | evier   | bleu |  65 | rover  | Londres  | 
|  16 | JaiTout | Marseille |  11 |   302 |  100 | lampe a souder | noir |  3 | rover  | Londres  | 
|  14 | Stock10 | Paris  |  16 |   302 |  49 | casserole  | NULL |  0 | rover  | Londres  | 
|  16 | JaiTout | Marseille |  18 |   302 |  88 | lampe halogene | NULL | NULL | rover  | Londres  | 
|  14 | Stock10 | Paris  |  3 |   402 |  315 | bureau   | jaune |  45 | peugeot  | Toulouse  | 
|  14 | Stock10 | Paris  |  10 |   402 |  100 | lampe halogene | rose |  11 | peugeot  | Toulouse  | 
|  14 | Stock10 | Paris  |  13 |   402 |  499 | casse-noix  | vert |  1 | peugeot  | Toulouse  | 
|  14 | Stock10 | Paris  |  20 |   402 |  13 | telephone  | NULL |  3 | peugeot  | Toulouse  | 
+----------+-----------+-----------+----------+-------------+----------+-----------------+--------+--------+--------------+--------------+ 
0

首先,要簡化。你有3個查找表...產品,工廠和商店。 然後列出所有由哪些工廠生產的商店提供的產品。

現在,這就是說,你的問題本身並不十分清楚,但我的印象是,你想知道哪些商店有可用同一家工廠生產的完全相同的產品。

也就是說,基於產品通用產品/工廠,在Provenance表中重新開始一個簡單的查詢,而不考慮商店。獲得此組的計數數量> 1.這導致哪些產品由多個商店位置銷售。

讓我們看看這個表的層次結構,從每個查找提供的內容開始。

select 
     PV.ref_prod, 
     PV.ref_factory, 
     count(*) as howManyShops 
    from 
     Provenance PV 
    group by 
     PV.ref_prod, 
     PV.ref_factory 
    having 
     count(*) > 1 

現在,如果你想獲得這些產品,工廠和商店的價值觀,用這個結果,它加入到種源同一產品/工廠,但現在,加入到爲查找表各自的描述性組件。就像是。

select 
     PV2.ref_prod, 
     PV2.ref_factory, 
     PV2.ref_shop, 
     PV2.quantity, 
     PR.name_prod, 
     PR.color, 
     PR.weight, 
     F.name_factory, 
     F.City, 
     S.name_shop, 
     S.City as ShopCity 
    from 
     (select 
       PV.ref_prod, 
       PV.ref_factory, 
       count(*) as howManyShops 
      from 
       Provenance PV 
      group by 
       PV.ref_prod, 
       PV.ref_factory 
      having 
       count(*) > 1) DupQualified 
     JOIN Provenance PV2 
      on DupQualified.ref_prod = PV2.ref_prod 
      AND DupQualified.ref_factory = PV2.ref_factory 
      JOIN Produit PR 
       on PV2.ref_prod = PR.ref_prod 
      JOIN Factory F 
       on PV2.ref_factory = F.ref_factory 
      JOIN Shop S 
       on PV2.ref_shop = S.ref_shop 
    order by 
     PR.name_prod, 
     F.name_factory, 
     S.name_shop 

訂單的最終通過將才去下一個產品/工廠顯示了同樣的產品/工廠的所有店鋪相鄰。

如果我對我所設想的內容不正確,請告訴我,並請編輯您的原始問題,提供更多詳細信息以及查詢輸出的預期用途。