【问题标题】:MySQL. Subqueriesmysql。子查询
【发布时间】:2014-05-19 09:06:59
【问题描述】:

我无法理解子查询。有人可以向我解释一下吗?

我有这个问题:

SELECT substring_index(marca, ' ', 1) AS companie, count(*) AS numar_masini 
FROM tip_masina 
GROUP BY companie;

显示:

 companie   numar_masini    
  Chevrolet      5
  Dacia          1
  Dodge          5
  Ford       6

这个查询:

SELECT substring_index(id_masina, ' ', 1) AS marca, SUM(nr_vehicule) AS nr_masini 
FROM proprietate
GROUP BY marca;

显示:

 marca  nr_masini   
 Chevrolet     18
 Dodge      9
 Ford      11

我想正确地“组合”这些查询并获得以下结果:

  companie  numar_marci  numar_masini   
  Chevrolet      5            18
  Dacia          1             0 (or null)
  Dodge          5             9
  Ford           6            11 

我怎样才能正确地做到这一点?我不想要代码,我想要对子查询的正确解释,因为我没有正确理解它们,也没有找到合适的文档来向我解释。

【问题讨论】:

  • 尝试使用以下链接:MySql subqueries。有什么不清楚的可以问。
  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。另外,子查询的使用是一个特定的要求吗?
  • @Strawberry 不是特定要求。这是一个示例,因此我可以更好地学习和理解子查询。
  • 换句话说“'是'这是一个特定的要求,因为我想了解子查询”

标签: mysql sql database subquery


【解决方案1】:

子查询(以这种方式)只是返回一组行。您可以将子查询的结果视为表格。

例如,您的查询可以按如下方式使用。

SELECT b.marca, b.nr_masini, c.numar_masini
(
    SELECT substring_index(id_masina, ' ', 1) AS marca, SUM(nr_vehicule) AS nr_masini 
    FROM proprietate
    GROUP BY marca
) b
LEFT OUTER JOIN
(
    SELECT substring_index(marca, ' ', 1) AS companie, count(*) AS numar_masini 
    FROM tip_masina 
    GROUP BY companie
) c
ON b.marca = c.companie

这里是获取您的第一个查询并获得 4 个品牌(与他们一起计算的数量),然后将该结果与您的第二个查询的结果相结合。您的第二个查询只带回 3 行。

可能两个查询都可以返回另一个查询不返回的行。在这种情况下,您可以使用第三个子查询来获取主行。然后你可以加入另外两个反对那个:-

SELECT a.companie, b.nr_masini, c.numar_masini
FROM
(
    SELECT substring_index(marca, ' ', 1) AS companie
    FROM tip_masina 
    UNION
    SELECT substring_index(id_masina, ' ', 1) AS companie
    FROM proprietate
) a
LEFT OUTER JOIN
(
    SELECT substring_index(id_masina, ' ', 1) AS marca, SUM(nr_vehicule) AS nr_masini 
    FROM proprietate
    GROUP BY marca
) b
ON a.companie = b.marca
LEFT OUTER JOIN
(
    SELECT substring_index(marca, ' ', 1) AS companie, count(*) AS numar_masini 
    FROM tip_masina 
    GROUP BY companie
) b
ON a.companie = c.companie

通过这种方式,您可以使用一个子查询来获取所有可能的公司值的列表,并将其视为与其他 2 个子查询连接的表。

您可以将这些子查询中的每一个设置为一个视图,当您加入它们时,它们看起来更像表格。

【讨论】:

    【解决方案2】:

    这不是子查询。 substring_index 是一个函数。

    这就是子查询的工作原理。

    SELECT * 
    FROM
        (
         -- This is the subquery
         SELECT id, test1, test2 
         FROM table
        ) TableAlias
    

    基本上,mysql从内部select中收集结果:

    SELECT id, test1, test2 FROM table
    

    现在是TableAlias

    所以语法现在可以这样使用

    SELECT TableAlias.Id, TableAlias.test1, TableAlias.test2 
    FROM
        (
         -- This is the subquery
         SELECT id, test1, test2 
         FROM table
        ) TableAlias
    

    子查询对很多事情都很有用。就像使用 SUMAVG 等聚合函数时一样。那么它真的可以帮助ORDERreuslts。

    试试这个链接:http://www.toadworld.com/platforms/mysql/w/wiki/6355.table-subqueries.aspx

    我希望对你解释子查询更好一点。

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多