簡體   English   中英

來自另一個子選擇的子選擇字段有什么問題?

[英]What's wrong with subselect field from another subselect?

我的表是:

  • tbl_activity(id,名稱)
  • tbl_activity_package(id,activity_id,name)
  • 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'子句中的Unknown列' 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_inner選擇中,使用別名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,名稱)tbl_activity_package(id,activity_id,名稱)tbl_activity_package_address(id,activity_package_id,地區)

結果將產生所有具有任何包的活動,並在某個地區包含包地址,並列出該活動覆蓋的所有地區。

這個查詢可以做到

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

嘗試這個

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM