MySQL - ऑपरेंड में 1 कॉलम होना चाहिए


92

मेरे द्वारा बनाई जा रही प्रणाली पर काम करते समय, मैंने अपने प्रोजेक्ट में निम्नलिखित क्वेरी का उपयोग करने का प्रयास किया:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id

जैसा कि मैं पीडीओ का उपयोग कर रहा हूं, "कैट" मेरे PHP कोड से बंधा हुआ है। 2 ": बिल्ली" के लिए एक वैध मूल्य है।

हालांकि यह प्रश्न मुझे एक त्रुटि देता है: "# 1241 - ऑपरेंड में 1 कॉलम होना चाहिए"

मुझे क्या स्टंप करना है, मुझे लगता है कि यह क्वेरी काम नहीं करेगी। स्तंभों का चयन करना, फिर किसी अन्य तालिका से दो और का चयन करना, और वहां से जारी रखना। मैं अभी पता नहीं लगा सकता कि समस्या क्या है।

क्या इस पर कोई सरल समाधान है, या मेरी क्वेरी लिखने का कोई अन्य तरीका है?

जवाबों:


103

आपकी उपशम दो कॉलम का चयन कर रही है, जबकि आप इसका उपयोग एक कॉलम (बाहरी SELECTक्लॉज के हिस्से के रूप में ) प्रोजेक्ट करने के लिए कर रहे हैं । आप इस संदर्भ में ऐसी क्वेरी से केवल एक कॉलम चुन सकते हैं।

usersइसके बजाय तालिका में शामिल होने पर विचार करें ; यह आपको अधिक लचीलापन देगा जब आप चाहते हैं कि किस कॉलम का चयन करें users

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
users.username AS posted_by,
users.id AS posted_by_id

FROM topics

LEFT OUTER JOIN posts ON posts.topic_id = topics.id
LEFT OUTER JOIN users ON users.id = posts.posted_by

WHERE topics.cat_id = :cat
GROUP BY topics.id

जवाब के लिए धन्यवाद। मैं अपनी क्वेरी ठीक करूंगा, और आपको उत्तर के रूप में चिह्नित करूंगा, लेकिन सिर्फ इनपुट के लिए, क्या आपको लगता है कि मेरी क्वेरी को लिखने के लिए "बेहतर" तरीका है जो मैं अभी उपयोग कर रहा हूं (लेकिन इसमें त्रुटि की भी उपेक्षा कर रहा हूं)?

आह। अपनी मूल पोस्ट पर संपादन के लिए धन्यवाद। जब StackOverflow मुझे अनुमति देता है तो मैं आपको उत्तर के रूप में चिह्नित करना सुनिश्चित करूंगा। आपका बहुत बहुत धन्यवाद!

खैर, COUNT()चीजों को थोड़ा दूर फेंक रहा है; मेरे द्वारा दी गई क्वेरी शायद एकत्रीकरण के कारण त्रुटि देगी। आपको अपनी क्वेरी के लक्ष्यों (जो इस समय मेरे लिए स्पष्ट नहीं हैं) के आधार पर, उस एकत्रीकरण को एक उपश्रेणी में स्थानांतरित करने की आवश्यकता हो सकती है।
cdhowie

17

अगर आप गलती से बजाय अल्पविराम का उपयोग यह त्रुटि भी हो सकता है ANDमें ONएक के खंड JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma

9

अगर आप गलती से उपयोग करें यह त्रुटि भी हो सकता है =के बजाय INमें WHEREखंड:

उदाहरण के लिए:

WHERE product_id = (1,2,3);

1
या IN के बजाय LIKE करें जैसा कि मैंने किया और पाया कि यह त्रुटि क्यों होती है। सूचक के लिए ty।
एडगर ऐवारस

यदि आप सेलेक्ट क्लॉज में फील्ड के चारों ओर कोष्ठक लगाते हैं तो यह भी हो सकता है, उदाहरण के लिए सेलेक्ट (फील्ड 1, फील्ड 2) टेबल से
पॉल क्रिस जोन्स

6
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)

ठीक है, आप इस तरह एक उपवर्ग से कई कॉलम प्राप्त नहीं कर सकते। सौभाग्य से, दूसरा कॉलम पहले से ही हैposts.posted_by ! इसलिए:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
posts.posted_by
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by_username
    FROM users
    WHERE users.id = posts.posted_by)
...

1

मेरे मामले में, समस्या यह थी कि मैंने अपने कॉलम चयन को गलती से कोष्ठक के साथ चुना:

SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;

और होना चाहिए:

SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;

मूर्खतापूर्ण लगता है, लेकिन यह त्रुटि पैदा कर रहा था और इसे पता लगाने में कुछ समय लगा।


मैं विश्वास नहीं कर सकता कि यह मेरी समस्या क्या थी, मैंने सोचा कि कोष्ठक वहां कानूनी थे
जोश मैकगी

0

एक अन्य स्थान पर यह त्रुटि हो सकती है एक मान प्रदान करना जिसमें एक स्ट्रिंग के बाहर एक अल्पविराम होता है। उदाहरण के लिए:

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)

0

यदि आप गलती से चूक जाते हैं तो यह त्रुटि भी हो सकती है if फ़ंक्शन का नाम करते हैं।

उदाहरण के लिए:

set v_filter_value = 100;

select
    f_id,
    f_sale_value
from
    t_seller
where
    f_id = 5
    and (v_filter_value <> 0, f_sale_value = v_filter_value, true);

जब मैं समारोह में डाल दिया तो यह समस्या आ गई if!


0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

यहां आप उप-क्वेरी का उपयोग कर रहे हैं, लेकिन इस उप-क्वेरी को केवल एक कॉलम वापस करना होगा। इसे अलग करें अन्यथा यह त्रुटि दिखाएगा।


0

गलत स्थान पर कोष्ठक जोड़ने के कारण, Intellij कंसोल में MySQL स्क्रिप्ट निष्पादित करते समय मुझे यह त्रुटि मिली:

गलत:

SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument

सही:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct

यह यहां पहले उत्तर के साथ मेल नहीं खाता है: stackoverflow.com/questions/24551177/…
rubydio

@rubydio, यह प्रश्न HQL और हाइबरनेट का संदर्भ देता है, जबकि मेरा जवाब
इंटेलीज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.