Mysql:如何在子查询中显示表格?

时间:2017-11-24 04:05:16

标签: mysql sql

我有Mysql(mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1),我写了这样一个查询:

SELECT
  (SELECT count(*)
   FROM items
   WHERE items.shop_id = shops.id),
  (SELECT sum(click)
   FROM items
   WHERE items.shop_id = shops.id),
  (SELECT sum(view)
   FROM items
   WHERE items.shop_id = shops.id)
FROM shops

它运作良好。但今天,我遇到了一个需要像这样的SQL的问题:

SELECT
  (SELECT count(*)
   FROM items
   WHERE items.shop_id = shops.id),
  (SELECT sum(click)
   FROM items
   WHERE items.shop_id = shops.id),
  (SELECT sum(view)
   FROM items
   WHERE items.shop_id = shops.id),
  (
    SELECT sum(count)
    FROM (
           SELECT
             max(id),
             sum(view) AS 'count'
           FROM items
           WHERE items.shop_id = shops.id
           GROUP BY items.cat_id) a
  )
FROM shops

Mysql提供Unknown column 'shops.id' in 'where clause'。所以我的问题是:

  1. 为什么shops.id在具有(SELECT sum(click) FROM items WHERE items.shop_id = shops.id)之类的深度的子查询中可见,但在进入具有两个深度的子查询时却不可见?

  2. 有没有办法让shops.id在深度二查询中可见?

3 个答案:

答案 0 :(得分:1)

我不是这方面的专家,但我会从我的最佳理解中解释它。

可以有两种类型的子查询: 1)相关和(2)不相关

让我们从你的问题中举一个例子:

SELECT
  (SELECT count(*)
   FROM items
   WHERE items.shop_id = 1)
from shops;

在上面的查询中,子查询仅使用该子查询的From子句中定义的表的字段。这是Uncorrelatedlated子查询的示例。

现在,让我们看看您的实际查询:

SELECT
  (SELECT count(*)
   FROM items
   WHERE items.shop_id = shops.id)
from shops;

这里,子查询使用shops.id,它不是子查询中表空间定义的一部分。

子查询(或内部SELECT语句)在它产生的值取决于包含它的外部SELECT语句产生的值时是相关的。

此处,子查询的外部部分是表shops,子查询可以看到它。

现在,让我们回答一个真正的问题:

select
 (
    SELECT sum(count)
    FROM (
           SELECT
             max(id),
             sum(view) AS 'count'
           FROM items
           WHERE items.shop_id = shops.id
           GROUP BY items.cat_id) a
  )
FROM shops;

这里,子查询本身在From子句中。 From子句用于获取将在其上执行不同操作的表。但是这里From子句本身依赖于外部选择,这不应该是这种情况。

因此,shops.id在最后一个子查询中不可见。

我希望这对你有用。

答案 1 :(得分:0)

您可以将搜索重写为

dict1 = {1:'a',2:'b',3:'c'}
dict2 = {1:'d',2:'e'}

答案 2 :(得分:0)

您可以在子查询中创建视图和使用

 create view group_count (shop_id,id,count) as 
(
SELECT
           shop_id as 'shop_id',
           max(id)  AS 'id',
           sum(view) AS 'count'
FROM items
GROUP BY items.shop_id,items.cat_id
)

http://sqlfiddle.com/#!9/6fc2962/1/0