2010-07-31 16 views
9

के साथ क्वेरी में अनदेखा किया गया है, मुझे दूसरी तालिका से कुछ पंक्तियों का चयन करने और उन्हें अल्पविराम से अलग स्ट्रिंग में संयोजित करने की आवश्यकता है। प्रश्न एक समस्या को छोड़कर अच्छी तरह से काम करता है - यह हमेशा सभी पंक्तियों का चयन करता है और LIMIT को अनदेखा करता है।LIMIT GROUP_CONCAT

यह है कि स्ट्रिंग हो जाता है और ध्यान नहीं देता है मेरी क्वेरी का हिस्सा है LIMIT में:

select 
    group_concat(value order by `order` asc SEPARATOR ', ') 
from slud_data 
    left join slud_types on slud_types.type_id=slud_data.type_id 
where slud_data.product_id=18 and value!='' and display=0 limit 3; 


// Result: 
+---------------------------------------------------------+ 
| group_concat(value order by `order` asc SEPARATOR ', ') | 
+---------------------------------------------------------+ 
| GA-XXXX, Bentley, CONTINENTAL FLYING SPUR, 2006   | 
+---------------------------------------------------------+ 

// Expected result: (only 3 comma-separated records, not 4) 

पूर्ण क्वेरी:

SELECT *,product_id id, 
    (select group_concat(value order by `order` asc SEPARATOR ', ') from slud_data left join slud_types on slud_types.type_id=slud_data.type_id where slud_data.product_id=t1.product_id and value!='' and display=0 limit 3) text 
FROM slud_products t1 
WHERE 
    now() < DATE_ADD(date,INTERVAL +ttl DAY) and activated=1 
ORDER BY t1.date desc 

उत्तर

10

सीमा खंड अंतिम परिणाम सेट में पंक्तियों की संख्या को सीमित करता है, नहीं GROUP_CONCAT में स्ट्रिंग बनाने के लिए उपयोग की जाने वाली पंक्तियों की संख्या। चूंकि आपकी क्वेरी अंतिम परिणाम में केवल एक पंक्ति लौटाती है, इसलिए LIMIT का कोई प्रभाव नहीं पड़ता है।

आप LIMIT 3 के साथ एक सबक्वायरी बनाकर अपनी समस्या का समाधान कर सकते हैं, फिर बाहरी क्वेरी में उस सबक्वायरी के परिणामस्वरूप GROUP_CONCAT लागू करें।

11

आपकी क्वेरी काम नहीं कर रही है क्योंकि आप @Mark Byers outlined in the other answer के कारणों के लिए काम करते हैं। इसके बजाय आप निम्नलिखित की कोशिश करना चाहते हो सकता है:

SELECT GROUP_CONCAT(`value` ORDER BY `order` ASC SEPARATOR ', ') 
FROM (
      SELECT `value`, `order` 
      FROM  slud_data 
      LEFT JOIN slud_types ON slud_types.type_id = slud_data.type_id 
      WHERE  slud_data.product_id = 18 AND value != '' AND display = 0 
      LIMIT  3 
     ) a; 
0

मार्क बायर्स विचार का एक उदाहरण:

SELECT GROUP_CONCAT(id, '|', name) 
FROM (
SELECT id, name 
FROM users 
LIMIT 3) inner