2012-12-26 13 views
24

मैं इस तरह एक मेज है:MySQL एकाधिक कहाँ खण्ड

id image_id style_id style_value 
----------------------------------- 
1 45  24  red 
1 45  25  big 
1 47  26  small 
1 45  27  round 
1 49  28  rect 

मैं image_id स्तंभ लेने के लिए चाहते हैं:

  • style_id = 24 और style_value = red
  • style_id = 25 और style_value = big
  • style_id = 26 और style_value = round

मैं इस तरह एक प्रश्न करना है:

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') AND (style_id = 25 AND style_value = 'big') AND (style_id = 27 AND style_value = 'round') 

लेकिन मैं किसी भी परिणाम नहीं मिल सका। जब मैं इस नमूना को OR के साथ बना देता हूं, तो यह अच्छी तरह से काम करता है। लेकिन मुझे इसे और साथ करना है। क्योंकि मुझे छवि आईडी की आवश्यकता है जो दोनों "लाल, बड़े और आयत" हैं।

मैंने Google के साथ बहुत सी खोज की है लेकिन कोई समाधान ठीक नहीं कर सका।

धन्यवाद,

अच्छा काम है।

+0

क्या style_id और style_value के बीच कोई निर्भरता है? यही है, style_id 24 मतलब "लाल" है, जबकि style_id 25 का मतलब है "बड़ा"? – mdoyle

+0

हां, मेरे पास "शैलियों" नाम की एक और तालिका है। और एक शैली में 5-6 अलग-अलग विकल्प हैं। उदाहरण के लिए: style_id 24 में 5 अलग-अलग विकल्प हैं (लाल, हरा, पीला, ...)। –

+0

क्या आप 'तालिका बनाएं तालिका \ G' बना सकते हैं और' तालिका शैलियों को बनाएंगे \ G' दिखा सकते हैं, और तालिका 'शैलियों' से कुछ नमूना पंक्तियां भी प्रदान कर सकते हैं? – mdoyle

उत्तर

0

यह हो सकता है कि आप क्या कर रहे हों, हालांकि कई स्टाइल_आईडी के आधार पर यह लागू करना मुश्किल होगा (सुनिश्चित नहीं है कि उन style_id स्थिर हैं या नहीं)। यदि यह मामला है, तो यह वास्तव में संभव नहीं है कि आप क्या चाहते हैं क्योंकि WHERE क्लॉज पंक्ति पर पंक्ति के आधार पर काम करता है।

WITH cte as (
    SELECT 
    image_id, 
    max(decode(style_id,24,style_value)) AS style_colour, 
    max(decode(style_id,25,style_value)) AS style_size, 
    max(decode(style_id,27,style_value)) AS style_shape 
    FROM 
    list 
    GROUP BY 
    image_id 
) 
SELECT 
    image_id 
FROM 
    cte 
WHERE 
    style_colour = 'red' 
    and style_size = 'big' 
    and style_shape = 'round' 

http://sqlfiddle.com/#!4/fa5cf/18

+0

मैंने sqlfiddle में कोशिश की है, लेकिन ये मान स्थिर नहीं हैं। तो मुझे एक गतिशील संस्करण में परिवर्तित करना है। अगर मुझे कोई व्यावहारिक समाधान नहीं मिल रहा है, तो मैं आपके समाधान का प्रयास कर सकता हूं। धन्यवाद लॉक। –

6

आप एक परिणाम कभी नहीं मिल जाएगा, यह एक सरल तर्क त्रुटि है।

आप अपने डेटाबेस को एक पंक्ति वापस करने के लिए कह रहे हैं जिसमें style_id = 24 AND style_id = 25 AND style_id = 26 है। चूंकि 24 नीदर 25 और न ही 26 है, तो आपको कोई परिणाम नहीं मिलेगा।

आपको OR का उपयोग करना है, तो यह कुछ समझ में आता है।

+0

लेकिन, वहाँ भी दोनों कर रहे हैं, image_id (45) => style_id (24), image_id (45) => style_id (25), image_id (45) => style_id (26) ... इसका मतलब है कि तालिका में एक ही छवि_आईडी के साथ 3 अलग-अलग पंक्तियां हैं। –

+0

तो आपको उसी छवि_आईडी के लिए भी जांच करनी चाहिए। मुझे पूरा यकीन नहीं है कि आपके एसक्यूएल का उद्देश्य क्या है। – akashivskyy

37

मुझे लगता है कि आप इस के बाद कर रहे हैं:

SELECT image_id 
FROM list 
WHERE (style_id, style_value) IN ((24,'red'),(25,'big'),(27,'round')) 
GROUP BY image_id 
HAVING count(distinct style_id, style_value)=3 

आप उपयोग कर सकते हैं नहीं और, क्योंकि मूल्यों 24 red और 25 big और 27 round एक ही पंक्ति में एक ही समय में नहीं किया जा सकता है, लेकिन आप की जरूरत है image_id के तहत, कई पंक्तियों में style_id, style_value की उपस्थिति की जांच करें।

इस क्वेरी में मैं आईएन का उपयोग कर रहा हूं (वह, इस विशेष उदाहरण में, एक OR के बराबर है), और मैं मिलान की अलग पंक्तियों की गिनती कर रहा हूं। यदि 3 अलग-अलग पंक्तियां मिलती हैं, तो इसका मतलब है कि सभी 3 विशेषताएँ image_id के लिए मौजूद हैं, और मेरी क्वेरी इसे वापस कर देगी।

+0

कभी नहीं पता था कि आप उस समूह को कहां समूह कर सकते हैं। निफ्टी। – erich2k8

9
SELECT a.image_id 
FROM list a 
INNER JOIN list b 
    ON a.image_id = b.image_id 
    AND b.style_id = 25 
    AND b.style_value = 'big' 
INNER JOIN list c 
    ON a.image_id = c.image_id 
    AND c.style_id = 27 
    AND c.style_value = 'round' 
WHERE a.style_id = 24 
    AND a.style_value = 'red' 
+0

धन्यवाद। मुझे वही चाहिए जो मुझे चाहिए। हॊ गया। अच्छा काम करना। –

0
select unique red24.image_id from 
( 
    select image_id from `list` where style_id = 24 and style_value = 'red' 
) red24 
inner join 
( 
    select image_id from `list` where style_id = 25 and style_value = 'big' 
) big25 
on red24.image_id = big25.image_id 
inner join 
( 
    select image_id from `list` where style_id = 27 and style_value = 'round' 
) round27 
on red24.image_id = round27.image_id 
+0

धन्यवाद। आपका कोड बहुत अच्छी तरह से काम करता है। मैं केवल अपनी ज़रूरत के अनुसार "अद्वितीय" पैरामीटर को हटा देता हूं। अभी सबकुछ ठीक है। फिर से धन्यवाद और एक अच्छा काम है। –

0

इस क्वेरी का उपयोग कर आप किसी भी परिणाम या खाली परिणाम नहीं मिलता है हो सकता है। आपको नीचे दी गई अपनी क्वेरी में AND के बजाय OR का उपयोग करने की आवश्यकता है।

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') OR (style_id = 25 AND style_value = 'big') OR (style_id = 27 AND style_value = 'round'); 

इस क्वेरी बाहर की कोशिश करो।

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