/ / mysql композитни ако колона от композитни стойности? - mysql, if-statement, composite

mysql композитни ако колона от композитни стойности? - mysql, if-statement, composite

Трябва да добавя допълнителна колона към резултатите от заявките си,

Колоната трябва да се нарича% ако col1 == 0 тогава percent трябва да съдържат NIS още percent трябва да съдържат ceil(col2 / col1 * 100)

Така че аз вярвам, че следното трябва да работи:

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

Но аз се сблъсквам с проблем, тъй като col1 и col2 също са композитни.

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

Затова се ударих

Неизвестна колона "col1" в "списъка с полета"

Мога да разбера този въпрос
IF(COUNT(distinct i.id) = 0, "NIS", ceil(COUNT(distinct q.id) / COUNT(distinct i.id) * 100)) as percent

Но това просто изглежда като куп допълнителна обработка за мен, със сигурност има по-добър начин около това?

Пълно запитване

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

Отговори:

1 за отговор № 1

Както бе споменато в SELECT Синтаксис:

Не е допустимо да се препраща към колона псевдоними в a WHERE клауза, тъй като стойността на колоната може все още да не бъде определена, когато WHERE клаузата се изпълнява. виждам Раздел В.5.5.4, "Проблеми с кодовите псевдоними".

Макар че ръководството не казва изрично, същата логика се отнася и за препращането към псевдоним в а select_expr.

Можете да поставите заявката си в подразделение към външна, която изчислява percent използвайки псевдонимите на колони:

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

Но не мисля, че това наистина си заслужава вярвам (търся позоваване, което мога да цитирам, но все още няма нищо) MySQL само ще изчисли всеки COUNT() веднъж и използвайте кеширания резултат във всяка отпратка.