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/

相关文章:

javascript - jquery - 根据文本输入改变图像

mysql - 想要在 spring mvc 3 中为我的登录表单使用 session 变量

mysql - NOT IN 比 MySQL 中的不等式快吗?

sql - 为什么此 Azure SQL 存储过程无法执行?

mysql 查询似乎有错误。我可以用一个查询选择更新的列吗

mysql - 我如何从购买价格中计算项目?

MySQL 按用户分隔值

php - mysqli_multi_query何时停止执行?

c# - asp.net - 如何在 Sql 中使用变量?

sql - 如何防止 Visual Basic 2012 中以下代码的 SQL 注入(inject)