mysql - 来自另一个子选择的子选择字段有什么问题?

标签 mysql sql

我的 table 是:

  • tbl_activity(id, 名称)
  • tbl_activity_package(id、activity_id、名称)
  • tbl_activity_package_address(id,activity_package_id,地区)

用户给出一个地区,我返回该地区发生的事件列表。根据事件可能有多个地区,因此我稍后必须通过 GROUP_CONCAT() 返回它。

SELECT a.name, ap.name
FROM (
    SELECT apa_inner.activity_package_id AS activity_package_id
    FROM tbl_activity_package_address AS apa_inner
    WHERE district = 'Beja'
) AS apa
INNER JOIN (
    SELECT ap_inner.id, ap_inner.name, ap_inner.activity_id
    FROM tbl_activity_package_address AS apa_inner
    INNER JOIN tbl_activity_package AS ap_inner ON ap_inner.id = apa.activity_package_id
) AS ap ON apa.activity_package_id = ap.id
INNER JOIN tbl_activity AS a ON a.id = ap.activity_id

这给了我错误:“'on'子句中的未知列'apa.activity_package_id'”

<小时/>
SELECT a.name, ap.name
FROM (
    SELECT id, activity_package_id
    FROM tbl_activity_package_address AS apa_inner
    WHERE district = 'Beja'
) AS apa
INNER JOIN (
    SELECT ap_inner.id AS id, ap_inner.name, ap_inner.activity_id
        FROM tbl_activity_package_address AS apa_inner
        INNER JOIN tbl_activity_package AS ap_inner ON ap_inner.id = apa_inner.activity_package_id
        WHERE apa_inner.id = apa.id
) AS ap ON apa.activity_package_id = ap.id
INNER JOIN tbl_activity AS a ON a.id = ap.activity_id

这给了我错误:“where 子句中存在未知列 'apa.id'”

最佳答案

旧答案

在第二个子选择中,您使用别名 apa_innerap_inner 所以

SELECT a.name, ap.name
FROM (
    SELECT apa_inner.activity_package_id AS activity_package_id
    FROM tbl_activity_package_address AS apa_inner
    WHERE district = 'Beja'
) AS apa
INNER JOIN (
    SELECT ap_inner.id AS id
        FROM tbl_activity_package_address AS apa_inner
        INNER JOIN tbl_activity_package AS ap_inner ON ap_inner.id = apa_inner.activity_package_id
) AS ap ON apa.activity_package_id = ap.id
INNER JOIN tbl_activity AS a ON a.id = ap.activity_id

应该修复错误。但你真的需要这些子选择吗?我相信您可以简化这个查询。

<小时/>

新答案

来自

tbl_activity(id, name) tbl_activity_package(id, activity_id, name) tbl_activity_package_address(id, activity_package_id, district)

结果应生成具有某个包裹地址位于某个地区的所有包裹的所有事件,以及该事件涵盖的所有地区的列表。

这个查询就可以了

SELECT
    a.name,
    GROUP_CONCAT(DISTINCT apa.district ORDER BY apa_district) AS distritos
FROM
    tbl_activity a
INNER JOIN
    tbl_activity_package ap
ON
    a.id = ap.activity_id
INNER JOIN
    tbl_activity_package_address apa
ON
    ap.id = apa.activity_package_id 
WHERE a.id IN (
    SELECT 
        ap_inner.activity_id
    FROM
        tbl_activity_package AS ap_inner
    INNER JOIN
        tbl_activity_package_id apa_inner
    ON
        ap_inner.id = apa_inner.activity_package_id 
    WHERE    
        apa_inner.district = 'Beja'
)       
GROUP BY 
    a.name

关于mysql - 来自另一个子选择的子选择字段有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585041/

相关文章:

MySQL 错误 1215 - 无法添加外键约束

sql - 从连接表中过滤

php - 从 mysql 返回数据,其中值等于 URI

SQL Server - 可以在 CREATE TABLE 中添加字段描述吗?

sql - 如何通过指定字节数来对字符串进行子字符串化

sql - 按相似数量分组 SQL (oracle sql)

html - 使用 Lambda、API 网关和 HTTP 请求将 AWS RDS 的查询结果显示到公共(public)网页

php - 从 MySQL 转换 Yii 查询

mysql - 对两个表的并集结果进行分页

sql - SQLite表达式可对按周分组的行进行计数