मुझे अपने क्वेरी परिणामों में एक अतिरिक्त कॉलम जोड़ना होगा,
स्तंभ को प्रतिशत कहा जाना चाहिए, अगर 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()
एक बार और प्रत्येक संदर्भ में कैश्ड परिणाम का उपयोग करें।