使用多个表

时间:2014-03-02 03:12:28

标签: mysql sql

我有4个不同行和列的表,我需要获取某些值。我有一些困难,似乎无法得到它。

customers表:

  • customerID:integer
  • fName:string
  • lName:string

items表:

  • itemID:整数
  • description:string
  • 价格:浮动

orders表:

  • orderID:integer
  • itemID:整数
  • aID:integer
  • customerID:integer
  • 日期:日期

addresses表:

  • aID:integer
  • housenum:整数
  • streetName:string
  • 镇:字符串
  • 州:字符串
  • ZIP:整数

我希望得到的价值是:

  1. 列出只有一个订单的所有商品的itemIDdescription

    现在我可以获得itemIDdescription,但我不知道如何将其归结为仅订购一次的商品。我正在考虑使用JOINGROUP BY,但我似乎无法找到正确的组合。

      SELECT itemID, 
             description 
        FROM items 
    GROUP BY itemID
    
  2. 列出所有将商品发送到多个地址的客户。

    这个我必须以某种方式使用JOIN,因为customerID会相同而不是地址吗?

    SELECT customerID, 
           streetName, 
           housenum 
      FROM addresses 
      JOIN customers 
        ON addresses.streetName = customers.customerID
    
  3. 返回所有订单产生的总收入。

    我不能只使用:

    SELECT SUM(price), 
           orderID 
      FROM items 
      JOIN orders 
        ON orders.orderID = items.price ? 
    
  4. 列出已将相同商品发送到至少两个不同地址的所有客户的名字和姓氏。

    SELECT fName, 
           lName, 
           itemID, 
           streetName, 
           housenum 
      FROM addresses, 
           customers, 
           items, 
    somehow join multiple(2+)?
    

1 个答案:

答案 0 :(得分:0)

我对所有查询可能不对,但我发现问题中列出的项目非常有趣,并决定尝试一下。

  1. 仅售出一次的商品

       SELECT o.itemID, 
              i.description 
         FROM orders o 
    LEFT JOIN items i
           ON i.id = o.itemID
     GROUP BY o.itemID
       HAVING COUNT(*) = 1;
    

    在此查询中,您需要加入items表,以便description检索GROUP BYitemID,以便您可以专门使用COUNT 1}}为每个itemID我们可以使用HAVING来获取1个订单。

  2. 已发货到差异地址的客户

       SELECT COUNT(DISTINCT addressID) as diff_address,
              c.fName,
              c.lName
         FROM orders o
    LEFT JOIN customers c
           ON o.customerID = c.id
     GROUP BY o.customerID
       HAVING diff_address > 1;
    

    我在这里使用DISTINCT函数来消除重复的地址和GROUP BY customerID所以我可以为每个客户提供一个唯一地址列表,并再次使用HAVING我们得到客户已经发运了超过1个不同地址的产品。我还在客户表上使用JOIN来获取他们所需的信息。

  3. 总收入

       SELECT SUM(i.price) as total
         FROM orders o
    LEFT JOIN items i
           ON o.itemID = i.id;
    

    我猜这个是最简单的一个,通过在项目表上使用JOIN,我能够阅读每个项目price,然后我可以按顺序求和以获得总数销售。

  4. 将相同项目发送到至少2个不同地址的客户列表

      SELECT c.fName,
             c.lName,
             COUNT(oi.itemID) AS `total items with diff address >= 2`
        FROM customers c
        JOIN (SELECT customerID,
                     itemID,
                     COUNT(DISTINCT addressID) AS diff_address
                FROM orders
            GROUP BY itemID, customerID
              HAVING diff_address >= 2
             ) AS oi
          ON oi.customerID = c.id
    GROUP BY c.id;
    

    这是最复杂的一个,希望我能解释一下。首先,我使用子查询启动它,在那里我可以列出每个拥有多个地址的客户的所有项目,然后在JOIN上使用customerID我可以计算给定客户已经提供的多少个不同的项目2个或更多差异地址。

  5. Here is a LIVE DEMO.

    如果您发现任何查询不好或有任何建议请告诉我,以便我可以改进。