2014-11-05 3 views
8

मेरे पास एक MySQL क्वेरी है जो सीधे मेरे स्थानीय MySQL डेटाबेस पर निष्पादित होने पर ठीक काम करती है, लेकिन PHP के माध्यम से निष्पादित होने पर एक अलग परिणाम दिखाती है।PHP और MySQL एक ही क्वेरी के साथ अलग-अलग परिणाम दिखाते हैं

SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count 
FROM 0_lychee_albums AS a 
LEFT JOIN (SELECT id, album, thumbURL, 
       @num := IF(@group = album, @num + 1, 0) AS count, 
       @group := album AS dummy 
     from 0_lychee_photos 
     WHERE album != 0 
     ORDER BY album, star DESC) AS t ON a.id = t.album 
WHERE count <= 2 OR count IS NULL; 

या एक एक लाइनर के रूप में:

SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count FROM 0_lychee_albums AS a LEFT JOIN (SELECT id, album, thumbURL, @num := IF(@group = album, @num + 1, 0) AS count, @group := album AS dummy FROM 0_lychee_photos WHERE album != 0 ORDER BY album, star DESC) AS t ON a.id = t.album WHERE count <= 2 OR count IS NULL; 

परिणाम:

| id | title    | public | sysstamp | password | thumbURL        | count | 
| 71 | [Import] 01  | 0  | 1415091268 | NULL  | cad008943372d984a9b74378874128f8.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415091268 | NULL  | 7b832b56f182ad3403521589e2815f67.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415091268 | NULL  | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 1  | 
| 72 | [Import] 9n4| 0  | 1415091268 | NULL  | a4d59377bed059e3f60cccf01a69c299.jpeg | 2  | 
| 73 | Untitled   | 0  | 1415114200 | NULL  | NULL         | NULL | 

पीएचपी परिणाम:

| id | title    | public | sysstamp | password | thumbURL        | count | 
| 71 | [Import] 01  | 0  | 1415091268 | NULL  | cad008943372d984a9b74378874128f8.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415091268 | NULL  | 7b832b56f182ad3403521589e2815f67.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415091268 | NULL  | f058f379ce519f1d8a2ff8c0f5003631.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415091268 | NULL  | a4d59377bed059e3f60cccf01a69c299.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415092318 | NULL  | 7b832b56f182ad3403521589e2815f67.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415092369 | NULL  | cad008943372d984a9b74378874128f8.jpeg | 0  | 
| 72 | [Import] 9n4| 0  | 1415092369 | NULL  | 84030a64a1f546e223e6a46cbf12910f.jpeg | 0  | 
| 73 | Untitled   | 0  | 1415114200 | NULL  | NULL         | NULL | 

क) count बढ़ती नहीं है की तरह यहहोना चाहिए बी) ए की वजह से) यह अधिक पंक्तियों को दिखाता है (इसे प्रति आईडी तक सीमित होना चाहिए)

मैंने इसे कई बार चेक किया, दोनों प्रश्न बिल्कुल समान हैं। PHP में कोई उपयोगकर्ता इनपुट या कोई अंतर नहीं है।

मैंने पहले ही similar questions चेक किया है, लेकिन उनमें से कोई भी मदद नहीं करता है। निम्नलिखित प्रश्न MySQL और PHP दोनों पर एक ही परिणाम दिखा रहे हैं:

SHOW VARIABLES LIKE 'character_set%'; 
SHOW VARIABLES LIKE 'collation%'; 

क्या कोई इस अंतर को हल करने के मुद्दे से अवगत है?

अधिक जानकारी के साथ संपादित करें:

$database = new mysqli($host, $user, $password, $database); 
$query = "SELECT a.id, a.title, a.public, a.sysstamp, a.password, t.thumbURL, t.count FROM 0_lychee_albums AS a LEFT JOIN (SELECT id, album, thumbURL, @num := IF(@group = album, @num + 1, 0) AS count, @group := album AS dummy FROM 0_lychee_photos WHERE album != 0 ORDER BY album, star DESC) AS t ON a.id = t.album WHERE count <= 2 OR count IS NULL"; 
$albums = $database->query($query); 
while ($album = $albums->fetch_assoc()) { print_r($album); } 

मैं भी साथ और क्वेरी निष्पादित करने से पहले निम्नलिखित के बिना इसे करने की कोशिश:

$database->set_charset('utf8'); 
$database->query('SET NAMES utf8;'); 
+0

num_rows() फ़ंक्शन आपको क्या बताता है? –

+0

यह संभव नहीं है कि एक लाइनर या स्वरूपित एसक्यूएल इतना अंतर करे, आपको अपना कोड देखना चाहिए। मुझे लगता है कि कुछ है। आपकी क्वेरी में केवल अंतर 'स्टार डीईएससी' है, लेकिन मुझे नहीं लगता कि differenc –

+0

सुनिश्चित करेगा कि आपका PHP कोड उसी डीबी को इंगित कर रहा है, जहां आप इस प्रश्न को बनाकर इस क्वेरी –

उत्तर

4

हाँ। select खंड में अभिव्यक्तियों के मूल्यांकन का आदेश गारंटी नहीं है। इसलिए, क्वेरी को कैसे लागू किया जाता है, इस पर निर्भर करता है कि परिवर्तनीय असाइनमेंट विभिन्न ऑर्डर में हो सकते हैं।

आप सभी परिवर्तनीय असाइनमेंट को एक अभिव्यक्ति में डालकर इसे ठीक कर सकते हैं। t के लिए इस सबक्वेरी उपयोग करके देखें:

(SELECT id, album, thumbURL, 
      (@num := IF(@group = album, @num + 1, 
         if(@group := album, 0, 0) 
         ) 
      ) as count 
    FROM 0_lychee_photos CROSS JOIN 
     (SELECT @num := 0, @group := NULL) vars 
    WHERE album <> 0 
    ORDER BY album, star DESC 
    ) t 

documentation में विशिष्ट विवरण है:

एक सामान्य नियम के रूप में, सेट बयान में अन्य की तुलना में, आप कभी नहीं एक उपयोगकर्ता चर को कोई मान निर्दिष्ट करना चाहिए और उसी कथन के भीतर मान पढ़ें। उदाहरण के लिए, एक चर बढ़ाने के लिए, तब ठीक है:

SET @a = @a + 1; 

इस तरह के चयन के रूप में अन्य विवरण, के लिए, आप परिणाम आप उम्मीद मिल सकता है, लेकिन यह गारंटी नहीं है। निम्नलिखित बयान में, आप सोच सकते हैं कि MySQL @a पहले का मूल्यांकन करेंगे और फिर दूसरी एक काम करते हैं:

SELECT @a, @a:[email protected]+1, ...; 

हालांकि, उपयोगकर्ता चर शामिल भाव के लिए मूल्यांकन के आदेश अपरिभाषित है।

+0

यह समस्या के पीछे कारण की तरह लगता है। मैंने इसे आपके फिक्स के साथ करने की कोशिश की, लेकिन यह अभी भी पहले की तरह है और 'गिनती' बढ़ रही नहीं है। क्या आप किसी अन्य समाधान से अवगत हैं, केवल 0_lychee_photos से अधिकतम 3 पंक्तियां लौट रहे हैं 0_lychee_albums के साथ शामिल हो गए हैं। – tobi

+0

@tobi। । । क्या आप एसक्यूएल फिडल पर एक उदाहरण डाल सकते हैं? –

0

इसे हल करने का एक आसान तरीका आपके PHP दस्तावेज़ में चर mysql सेट है। इस तरह: $ var = mysql_query ("SET @nun: = 0;");

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