来自另一个subselect的subselect字段有什么问题?

时间:2014-05-10 18:54:31

标签: mysql sql

我的表是:

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

用户给出一个区域,然后返回该区域内发生的活动列表。活动可以有多个分区,因此我必须在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

这给了我错误:"未知列' apa.activity_package_id'在' on'条款"


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

这给了我错误:"未知列' apa.id'在where子句"

2 个答案:

答案 0 :(得分:1)

旧答案

在您的第二个子选择中,您使用别名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

答案 1 :(得分:0)

试试这个

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