数据库架构:

DROP TABLE IF EXISTS salespersons, orders, orderlines, products; 
CREATE TABLE salespersons(salespersonid INT,NAME CHAR(8)); 
INSERT INTO salespersons VALUES(1,'Sam'),(2,'Xavier'); 
CREATE TABLE orders(orderid INT,salespersonid INT); 
INSERT INTO orders VALUES(1,1),(2,1),(3,1),(4,2),(5,2); 
CREATE TABLE orderlines(lineid INT,orderid INT,productid INT,qty INT); 
INSERT INTO orderlines VALUES(1,1,1,1),(2,1,1,2),(3,2,2,1),(4,3,1,1),(5,4,1,1),(6,5,2,2); 
CREATE TABLE products(productid INT,NAME CHAR(32)); 
INSERT INTO products VALUES(1,'computer desk'),(2,'lamp'),(3,'desk chair');

题 :

想要检索产品清单,即所有卖方出售的产品。

预期产量:

在此处输入图片说明

我创建了以下查询,

SELECT 
   p1.`name`  AS productList
FROM
  `products` AS p1 
  LEFT JOIN 
    (SELECT 
      p.`productid`,
      COUNT(DISTINCT (s.`salespersonid`)) AS productSellers,
      (SELECT 
        COUNT(*) 
      FROM
        salespersons) AS totalSeller 
    FROM
      `products` AS p 
      INNER JOIN orderlines AS ol 
        ON p.`productid` = ol.`productid` 
      INNER JOIN orders AS o 
        ON ol.`orderid` = o.`orderid` 
      INNER JOIN salespersons AS s 
        ON o.`salespersonid` = s.`salespersonid` 
    GROUP BY p.`productid` 
    HAVING productSellers = totalSeller) AS ps 
    ON p1.`productid` = ps.productid 
    WHERE ps.productid IS NOT NULL;

它给出了正确的结果,但是我不确定它是否为此类问题编写查询的标准方法。

如果有人知道更好的方式编写此问题的查询,那么请提出建议

===============>>#1 票数:2 已采纳

您的基本方法很好。 您正在将销售产品的销售人员数量与销售人员总数进行比较。 但是,您的查询可以简化:

SELECT p.Name
FROM products p INNER JOIN
     orderlines ol 
     ON p.productid = ol.productid INNER JOIN
     orders o 
     ON ol.orderid = o.orderid 
GROUP BY p.name
HAVING COUNT(DISTINCT o.salespersonid) = (SELECT COUNT(*) FROM salespersons);

更改如下:

  • 您不需要products的额外连接。 所有工作都在子查询中完成,它只需要返回所需的值。
  • 您无需加入SalesPerson表(除非o.SalesPersonId可能无效)。 您可以只从orders获取该列。
  • 您可以将表达式放在HAVING子句中,而不使用列别名。

作为优先事项,我还从表别名中删除了反引号和as 我发现反引号使查询更难阅读。 我只(并且始终)将as用作列别名,但发现它们对于表别名来说是不必要的。

===============>>#2 票数:1

您可以删除几个不必要的联接

SELECT 
   p1.`name`  AS productList
FROM
  `products` AS p1 
  LEFT JOIN 
    (SELECT 
      ol.`productid`,
      COUNT(DISTINCT (o.`salespersonid`)) AS productSellers,
      (SELECT 
        COUNT(*) 
      FROM
        salespersons) AS totalSeller 
    FROM
      orderlines AS ol 
      INNER JOIN orders AS o 
        ON ol.`orderid` = o.`orderid`  
    GROUP BY ol.`productid` 
    HAVING productSellers = totalSeller) AS ps 
    ON p1.`productid` = ps.productid 
    WHERE ps.productid IS NOT NULL;

这是一个SQLFiddle- http ://www.sqlfiddle.com/#!2 / 4aa66 /5

除此之外,如果您需要更好的性能,只需在有意义的地方添加索引。 一个很好的开始是在您要加入的列上,但是要理解,在更新/插入/删除记录时,这可能会导致额外的开销。

  ask by Dr_Dang translate from so

未解决问题?本站智能推荐:

2回复

MySQL查询以下

我有一个样品桌” 我希望结果为: 即,我不希望第二列中具有相同值的行
3回复

为以下要求编写选择查询

这是我的users表: http://ezinfotec.com/Capture.PNG 我需要选择除列外不包含2的所有行。 如何使用php和Mysql为此编写查询。 我期望此查询的结果仅返回最后一行。 谢谢。
1回复

MySQL查询帮助要求

我正在使用MySQL数据库。 我有员工假期表,其中包含有关员工假期的信息。 请查找表格详细信息: 要求输出:我想生成Report / excel以接收基于休假类型的月度员工休假数据的信息,即( 月度,休假类型数据 )格式应如下: 要求:我希望MySQL查询按月获取附加
2回复

MySQL特定查询要求

我在“销售”表中有日期时间字段名称“ salestime” 我需要获取数据为: 要么 有人知道如何使用查询来实现吗? 谢谢您的帮助
3回复

以下mysql查询有什么问题

我正在写一个从mysql数据库中选择用户的php脚本。 用户由用户名和用户所属的组定义。 我以前曾经这样做过,但是现在我得到了一个错误。 我正在使用xampp版本:1.7.4和PHP版本:5.3.5(VC6 X86 32bit)+ PEAR和MySQL版本5.5.8(社区服务器)运行
3回复

如何优化以下mysql查询?

我的表中有不同类别的数据。 我想计算类别每个部分中的项目。 每个部分包含两个以上类别。 如何优化此查询?
1回复

为什么以下mySQL查询失败?

我不知道为什么下面的mySQL查询不断给我以下错误: SQL查询本身是这样的: $ userID只是表的主键,只是VARCHAR。 我不知道为什么$ uri部分无效。 WindowsPhoneID应该存储为TEXT,因此不会有任何不匹配的类型或类似的东西。 有指针吗?
1回复

如何调整以下MySQL查询?

我使用以下MySQL查询工作正常,我的意思是给我所需的输出,但...让我们先看看查询: 我不想重复使用长度函数,因为我猜它会在每次声称性能问题时都会访问数据库。 请建议我是否可以存储一次长度并多次使用。
1回复

以下查询的mysql更新错误

我正在使用以下查询进行更新。 我的更新功能和连接字符串在jar文件中。 我正在使用JSP useBean从jar文件调用函数。 我能够在数据库上运行选择查询。 仅在更新时出现问题。 为什么我现在早些时候收到此错误,它工作正常。 查询 query2 错误:
3回复

如何优化以下mysql查询

我在mysql查询中遇到麻烦。 查询如下。 我如何优化可能将OR字删除的查询。 谢谢。 同样,查询可以像follow一样扩展。 有人可以解释一下解决方案的思路吗,非常感谢。