需要有关精确MYSQL查询的帮助

时间:2015-10-31 18:07:52

标签: 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

但我不知道如何只提供由同一工厂制造的同一产品的商店参考,并且它看起来像别名不适用于WHERE。 谢谢你的帮助。

4 个答案:

答案 0 :(得分:0)

produit表的架构本身是错误的。列名在表中必须是唯一的。

您可能会创建类似

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

插入语句需要相应更改,例如

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"中没有必要

,因为别名没有空格。

提供您希望查询返回的一些示例输出数据。

答案 1 :(得分:0)

与produit&tabouret&#39;相关的商店请求示例和工厂&#39;马丁&#39;

    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';

答案 2 :(得分: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     |
+----------+-----------+-----------+----------+-------------+----------+-----------------+--------+--------+--------------+--------------+

答案 3 :(得分:0)

首先,简化。您有3个查找表...产品,工厂和商店。 然后是一张表格,其中列出了由哪些工厂生产的商店提供的所有产品。

现在,那说,你的问题本身并不是很清楚,但我的印象是你想知道哪家商店有同一工厂生产的完全相同的产品。

也就是说,根据产品常见产品/工厂开始对Provenance表中的WHAT产品进行简单查询,而不考虑商店。通过此计数获得计数&gt; 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

现在,如果您想获取这些产品,工厂和商店的价值,请使用此结果并将其连接到同一产品/工厂的Provenance,但现在,请加入查找表以查找相应的描述性组件。像。的东西。

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

最终订单将在进入下一个产品/工厂之前显示相同产品/工厂的所有商店。

如果我对您所寻找的内容的假设不正确,请告诉我并请编辑原始问题,并提供更多详细信息以及查询输出的预期用途。