/ / mysql मिश्रित यदि संमिश्र मानों से स्तंभ? - mysql, if-statement, समग्र

समग्र मूल्य से कॉलम अगर mysql समग्र? - mysql, if-statement, समग्र

मुझे अपने क्वेरी परिणामों में एक अतिरिक्त कॉलम जोड़ना होगा,

स्तंभ को प्रतिशत कहा जाना चाहिए, अगर 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 वाक्य - विन्यास:

यह एक स्तंभ उर्फ ​​को संदर्भित करने के लिए अनुमेय नहीं है WHERE खंड, क्योंकि स्तंभ मान अभी तक निर्धारित नहीं किया जा सकता है जब WHERE खंड निष्पादित किया जाता है। देख धारा C.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() एक बार और प्रत्येक संदर्भ में कैश्ड परिणाम का उपयोग करें।