2012-11-15 19 views
5

में जहां मैं आइटम संपत्तियों की एक मेज है, और इस तरह से संरचित user_favorites की तालिका:MySQL - एक सबक्वेरी और

  • आईडी
  • ITEM_ID
  • user_id
  • पसंदीदा (bool)

जब कोई उपयोगकर्ता "पसंदीदा" आइटम करता है तो यह आइटम आईडी, उपयोगकर्ता आईडी का उपयोग करके इस तालिका में एक पंक्ति जोड़ता है, और पसंदीदा प्रॉपर्टी को 1 पर सेट करता है (यदि वे "प्रतिकूल ई "यह 0 में बदल गया है)।

मैं उत्पादों की सूचियों को देखते समय उपयोगकर्ता के पसंदीदा को दिखाने का तरीका जानने का प्रयास कर रहा हूं।

मैं वर्तमान में उपयोगकर्ता खोज इनपुट के आधार पर एक प्रश्न करता हूं और उत्पाद आईडी की एक श्रृंखला प्राप्त करता हूं। अब मैं उन उत्पादों के बीच उत्पाद जानकारी की एक तालिका बनाने के लिए एक प्रश्न करना चाहता हूं - और मैं यह शामिल करना चाहता हूं कि आइटम उपयोगकर्ता पसंदीदा है या नहीं।

मैं कुछ इस तरह की कोशिश की है:

select i.tid, i.name as name, i.image as image, (SELECT favorite FROM user_favorites WHERE user_id=77) as favorite 
    FROM items i 

    left join user_favorites ufav on (ufav.item_id = i.tid) 
    WHERE i.tid IN (79, 98, 105 . . .) 
    order by favorite DESC, name ASC 

ज़ाहिर है ..लेकिन मैं एक Subquery रिटर्न 1 से अधिक पंक्ति त्रुटि

मैं भी कुछ इस तरह की कोशिश की है मिलती है:

select i.tid, i.name as name, i.image as image, ufav.favorite as favorite 
    FROM items i 
    left join user_favorites ufav on (ufav.item_id = i.tid) 
    WHERE i.tid IN (79, 98, 105 . . .) AND ufav.user_id=77 
    order by favorite DESC, name ASC 

। । । लेकिन यह केवल उन वस्तुओं को लौटाता है जो पसंदीदा हैं (जैसा कि आप उम्मीद करेंगे)। मैं सभी आईडी की सूची में आइटम वापस करना चाहता हूं, लेकिन मैं यह भी जानना चाहता हूं कि कौन से आइटम "पसंदीदा" नहीं हैं।

क्या मैं इसे एक प्रश्न में कर सकता हूं, या दो अलग-अलग प्रश्नों को चलाने का मेरा सबसे अच्छा विकल्प है?

उत्तर

0

यहां दृष्टिकोण है जो मैंने उठाया:

(
    SELECT i.tid, i.name as name, i.image, 1 AS favorite 
    FROM items i 
    LEFT JOIN user_favorites ufav on (ufav.item_id = i.tid) 
    WHERE ufav.user_id = //the user id 
    AND i.tid IN (79, 98, 105 . . .) 
) 

UNION DISTINCT 

(
    SELECT i.tid, i.name as name, i.image as image, 0 AS favorite 
    FROM items i 
    WHERE NOT EXISTS (SELECT * 
         FROM user_favorites ufav 
         WHERE ufav.item_id = i.tid 
         AND ufav.user_id = //the user id 
         AND ufav.favorite=1 
         ) 
    AND i.tid IN (79, 98, 105 . . .) 
) 
    ORDER BY favorite DESC , i.name ASC 

इसके साथ कोई समस्या? ऐसा लगता है कि मैं उम्मीद कर रहा था, अब तक ...

1

उदाहरण इस ::

select 
i.tid, 
i.name as name, 
i.image as image, 
ifnull(favorite,false) as isFavorite 

FROM items i 
left join user_favorites ufav on (ufav.item_id = i.tid) 
WHERE i.tid IN (79, 98, 105 . . .) and ufav.user_id=77 
    order by favorite DESC, name ASC 
+0

साशी प्रतिक्रिया के लिए धन्यवाद, लेकिन जॉन वू सही है: मुझे उन वस्तुओं की आवश्यकता है जो परिणामों में दिखाने के लिए अनुकूल नहीं हैं। – Zarwell

1

मैं तुम्हें यहाँ CROSS JOIN उपयोग करने के लिए है क्योंकि आप सभी उपयोगकर्ताओं के लिए सभी आइटम दिखाना चाहते हैं की जरूरत है लगता है की कोशिश करो,

SELECT d.item_ID, d.Itemname, d.user_ID, 
     COALESCE(c.`favorite`, 0) Favorite 
FROM 
     (
      SELECT a.item_ID, a.Itemname, b.user_ID 
      FROM  items a CROSS JOIN 
        (
         SELECT DISTINCT user_ID 
         FROM user_favorites 
        ) b 
     ) d LEFT JOIN user_favorites c 
      ON c.item_ID = d.item_ID AND 
       c.user_ID = d.user_ID 
-- WHERE d.user_ID = 1  -- this is you condition 
ORDER BY d.user_ID, d.Item_ID 
+0

बहुत बढ़िया - बहुत बहुत धन्यवाद! मुझे यह जानने के लिए अध्ययन करना होगा कि क्या हो रहा है लेकिन यह पूरी तरह से काम कर रहा है। – Zarwell

+0

यह मेरे अपने उपयोगकर्ता आईडी के तहत मेरे परीक्षण के दौरान काम कर रहा था, लेकिन ऐसा नहीं था जब मैंने एक और इस्तेमाल किया। मुझे अंत में एहसास हुआ कि यह केवल तभी काम करता है जब उपयोगकर्ता ने कम से कम एक आइटम "पसंदीदा" किया हो (इसलिए उनके पास उपयोगकर्ता_ पसंदीदा तालिका में एक पंक्ति है)। दूसरे शब्दों में, यदि कोई उपयोगकर्ता किसी आइटम का अनुकूल नहीं है शून्य परिणाम लौटाए जाते हैं। इस बारे में कोई सलाह है कि इस बारे में कैसे जाना है? – Zarwell

संबंधित मुद्दे