2012-12-18 13 views
5

Sto riscontrando un problema nella clausola where della sottoquery INNER JOIN. Sto ricevendo un errore di colonna sconosciuta per M.idMembre. Ho provato a utilizzare il nome della tabella anziché l'alias, ma ottengo lo stesso problema. Ho anche provato a rimuovere la clausola WHERE dalla subquery e ad aggiungere questa condizione nella clausola ON dopo la sottoquery. Tuttavia, sto avendo lo stesso problema in entrambi i casi. Sento che è ovvio che mi manchi qui.Colonna sconosciuta in subquery where clausola

SELECT DISTINCT M.`idMembre` , `couponsTypes`.`maxCouponType` 
FROM membres AS `M` 
INNER JOIN (
SELECT idMembre, MAX(coupons.`idType`) AS `maxCouponType` 
FROM coupons 
WHERE coupons.`idMembre` = M.`idMembre` 
GROUP BY idMembre 
) AS `couponsTypes` 
ON M.`idMembre` = couponsTypes.`idMembre` 
ORDER BY maxCouponType DESC 

Fatemi sapere se avete bisogno di ulteriori informazioni.

+0

Sembra che non si utilizzi alcun criterio di join, inner join ... ON ... –

+0

Ho anche provato con il normale formato INNER JOIN ma sto ottenendo lo stesso errore per questa colonna. 'SELECT DISTINCT M.idMembre, couponsTypes.maxCouponType DA membres AS M INNER JOIN (SELECT MAX (coupons.idType) AS maxCouponType DA tagliandi) AS couponsTypes SU M.idMembre = coupons.idMembre ORDER BY maxCouponType desc' – oliboon

+0

L'utilizzo dell'alias per la tabella coupon mi dà anche un problema di colonna sconosciuta. – oliboon

risposta

7

Non è consentito fare riferimento a tabelle esterne in una subquery in una clausola join. Un modo per risolvere questo problema è quello di eseguire un group by nella sottoquery in base alla condizione di join:

SELECT DISTINCT M.`idMembre`, `couponsTypes`.`maxCouponType` 
FROM membres AS `M` INNER JOIN 
    (SELECT idMembre, MAX(coupons.`idType`) AS `maxCouponType` 
     FROM coupons 
     group by idmembre 
    ) `couponsTypes 
    on couponstypes.idMembre = M.idMember 
ORDER BY maxCouponType DESC 

Ma, non è necessario il tavolo membres a tutti. Sebbene con riferimento nell'esterno select, è equivalente all'ID membro nella tabella dei tipi di coupon. Quindi, è possibile scrivere la query come:

 SELECT idMembre, MAX(coupons.`idType`) AS `maxCouponType` 
     FROM coupons 
     group by idmembre 
     order by 2 desc 

Questa è probabilmente la formulazione più semplice e più efficiente modo.

+0

C'è una differenza tra le query nel caso in cui i membri non siano univoci nella tabella 'membre'? Non riesco proprio a capirlo, ma sono appena tornato da un pranzo piuttosto sdolcinato ... – eggyal

+0

@eggyal. . . In questo caso, in realtà non c'è differenza. Il 'distinto' rimuove i duplicati. Non scriverò la query in questo modo, ma non c'è una differenza. –

+0

Anche il buon punto riguardo ai "membres" non è necessario. – eggyal

1

La sottoquery non ha accesso alle tabelle nella query esterna. Cioè, la tabella membres (con alias come M) non è disponibile al momento della valutazione della sottoquery couponsTypes.

Tuttavia, tale subquery non dovrebbe essere necessaria in questo caso; si deve semplicemente bisogno di unire le tabelle direttamente e di gruppo il risultato:

SELECT idMembre, MAX(coupons.idType) AS maxCouponType 
FROM  membres JOIN coupons USING (idMembre) 
GROUP BY idMembre 
ORDER BY maxCouponType DESC