我有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'
。所以我的问题是:
为什么shops.id
在具有(SELECT sum(click) FROM items WHERE items.shop_id = shops.id)
之类的深度的子查询中可见,但在进入具有两个深度的子查询时却不可见?
有没有办法让shops.id
在深度二查询中可见?
答案 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
)