我的表是:
用户给出一个区域,然后返回该区域内发生的活动列表。活动可以有多个分区,因此我必须在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子句" 。
答案 0 :(得分:1)
旧答案
在您的第二个子选择中,您使用别名apa_inner
和ap_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'