/ / mysql composito se la colonna da valori compositi? - mysql, if-statement, composite

mysql composito se colonna da valori compositi? - mysql, if-statement, composite

Ho bisogno di aggiungere una colonna in più ai risultati della mia query,

La colonna deve essere chiamata percentuale, Se col1 == 0 poi percent dovrebbe contenere NIS altro percent dovrebbe contenere ceil(col2 / col1 * 100)

Quindi credo che il seguente dovrebbe funzionare:

IF(col1 = 0, "NIS", ceil(col2 / col1 * 100)) as percent

Ma mi imbatto in un problema in quanto col1 e col2 sono anche compositi "s.

COUNT(distinct i.id) as col1
COUNT(distinct q.id) as col2

Quindi mi viene colpito

Colonna sconosciuta "col1" in "elenco campi"

Potrei risolvere il problema con
IF(COUNT(distinct i.id) = 0, "NIS", ceil(COUNT(distinct q.id) / COUNT(distinct i.id) * 100)) as percent

Ma questo mi sembra un po 'di elaborazione in più, sicuramente c'è un modo migliore per aggirare questo?

Query completa

SELECT
`t`.*,
`r`.`name` AS region_name,
GROUP_CONCAT(DISTINCT p.ptype_id SEPARATOR "|") AS ptype_ids,
COUNT(DISTINCT q.id) AS quoted,
COUNT(DISTINCT i.id) AS intended,
COUNT(DISTINCT qa.id) AS awarded,
IF(
intended = 0,
`"NIS"`,
CEIL(quoted / intended * 100)
) AS percent
FROM
(`tradesmen` t)
LEFT JOIN `regions` r
ON `r`.`id` = `t`.`region_id`
LEFT JOIN `quotes` q
ON `t`.`id` = `q`.`tradesman_id`
LEFT JOIN `quote_intentions` i
ON `t`.`id` = `i`.`tradesman_id`
LEFT JOIN `quotes` qa
ON `q`.`tradesman_id` = `qa`.`tradesman_id`
AND qa.accepted = 1
LEFT JOIN `ptypes_tradesmen` p
ON `p`.`tradesman_id` = `t`.`id`
GROUP BY `t`.`id`
LIMIT 20

risposte:

1 per risposta № 1

Come menzionato in SELECT Sintassi:

Non è consentito fare riferimento a un alias di colonna in a WHERE clausola, perché il valore della colonna potrebbe non essere ancora determinato quando il WHERE clausola viene eseguita. Vedere Sezione C.5.5.4, "Problemi con gli alias di colonna".

Anche se il manuale non lo dice esplicitamente, lo stesso ragionamento si applica al riferimento ad un alias di colonna all'interno di a select_expr.

È possibile inserire la query in una sottoquery su una esterna che calcola percent utilizzando gli alias di colonna:

SELECT *, IF(intended, CEIL(quoted / intended * 100), NULL) AS percent FROM (
SELECT
`t`.*,
`r`.`name` AS region_name,
GROUP_CONCAT(DISTINCT p.ptype_id SEPARATOR "|") AS ptype_ids,
COUNT(DISTINCT q.id)  AS quoted,
COUNT(DISTINCT i.id)  AS intended,
COUNT(DISTINCT qa.id) AS awarded
FROM
(`tradesmen` t)
LEFT JOIN `regions` r
ON `r`.`id` = `t`.`region_id`
LEFT JOIN `quotes` q
ON `t`.`id` = `q`.`tradesman_id`
LEFT JOIN `quote_intentions` i
ON `t`.`id` = `i`.`tradesman_id`
LEFT JOIN `quotes` qa
ON `q`.`tradesman_id` = `qa`.`tradesman_id`
AND qa.accepted = 1
LEFT JOIN `ptypes_tradesmen` p
ON `p`.`tradesman_id` = `t`.`id`
GROUP BY `t`.`id`
LIMIT 20
) t

Tuttavia, non penso che questo sia davvero utile come me credere (Sto cercando un riferimento che posso citare, ma non ancora disponibile) MySQL calcolerà solo ciascuno COUNT() una volta e utilizzare il risultato memorizzato nella cache in ogni riferimento.