2009-04-29 20 views
27

मैं निम्नलिखित के रूप में दो प्रश्न हैं,:दो mysql प्रश्नों को PHP/MYSQL में कैसे निष्पादित करें?

SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10; 
SELECT FOUND_ROWS(); 

मैं एक ही प्रयास में इन दोनों प्रश्नों पर अमल करना चाहते हैं।

$result = mysql_query($query); 

लेकिन फिर मुझे बताओ कि मैं प्रत्येक टेबल अलग से सेट संभाल लेंगे। असल में ASP.NET में हम उपयोग करता डाटासेट जो

ds.Tables[0]; 
ds.Tables[1]; .. etc 

मैं एक ही का उपयोग कर PHP/MySQL कैसे कर सकते के रूप में दो प्रश्नों संभालती है?

+0

** यह संभव है ** ('CLIENT_MULTI_STATEMENTS' ध्वज का उपयोग करके http://stackoverflow.com/a/28984274/632951 देखें)। – Pacerier

उत्तर

32

अद्यतन: जाहिर mysql_connect() करने के लिए एक ध्वज पारित करके संभव। Executing multiple SQL queries in one statement with PHP देखें, फिर भी, किसी भी मौजूदा पाठक को mysql_-कार्यों का वर्ग और पीडीओ पसंद करना चाहिए।

आप PHP में नियमित mysql-api का उपयोग करके ऐसा नहीं कर सकते हैं। बस दो प्रश्न निष्पादित करें। दूसरा इतना तेज होगा कि इससे कोई फर्क नहीं पड़ता। यह माइक्रो अनुकूलन का एक विशिष्ट उदाहरण है। इसके बारे में चिंता मत करो।

रिकॉर्ड के लिए, यह mysqli और mysqli_multi_query-फ़ंक्शन का उपयोग करके किया जा सकता है।

+3

मैं मूल रूप से प्रदर्शन के बारे में चिंतित हूं, जो मुझे लगता है कि अगर हम डेटाबेस को दो बार मार देंगे तो मुझे कम लगेगा। – Prashant

+1

यदि आप आश्वस्त नहीं हैं तो एक बेंचमार्क करें। चयन FOUND_ROWS() क्वेरी निष्पादित करने में समय लगेगा और परिणाम पुनर्प्राप्त करने योग्य होगा। आपके पास पहले से कनेक्शन है, और परिणाम सेट बेहद छोटा है (केवल एक पूर्णांक)। –

+8

बीटीडब्ल्यू, यदि आप प्रदर्शन के बारे में चिंतित हैं तो आपको अपना समय LIKE '% प्रशांत%' कथन से छुटकारा पाने का प्रयास करना चाहिए। यह संभवतः एक वास्तविक प्रदर्शन मुद्दा है। अंगूठे के नियम के रूप में: अधिकांश PHP अनुप्रयोगों के लिए बोतल गर्दन php में नहीं बल्कि डेटाबेस में है। यदि आप अपने आवेदन को अनुकूलित करने में समय बिताना चाहते हैं, तो अपने सूचकांक और EXPLAIN की समीक्षा करें: अपने प्रश्नों को दर्ज करें। –

2
इस तरह

:

$result1 = mysql_query($query1); 
$result2 = mysql_query($query2); 

// do something with the 2 result sets... 

if ($result1) 
    mysql_free_result($result1); 

if ($result2) 
    mysql_free_result($result2); 
+0

क्या वह mysql_query को दो बार निष्पादित करने से नहीं बचाना चाहता था? –

+0

हां, मैं दो बार mysql querries से बचना चाहता हूँ। और @ जोन बेनेडिक्टो में जवाब देते हुए, वह दो प्रश्नों को निष्पादित कर रहा है। :( – Prashant

+0

मैंने अभी एक और जवाब पोस्ट किया है जो दिखाता है कि MySQLi का उपयोग करके दोनों प्रश्नों को निष्पादित करने के लिए कैसे करें। –

0

यह PHP साइट है कि multiple queries are NOT permitted पर कहते हैं (संपादित करें:। यह mysql विस्तार mysqli के लिए ही सही है और पीडीओ अनुमति देने के कई प्रश्न) । तो आप इसे PHP में नहीं कर सकते हैं, लेकिन, आप उस क्वेरी को किसी अन्य mysql_query कॉल में क्यों निष्पादित नहीं कर सकते हैं, (जैसे जॉन का उदाहरण)? यदि आप एक ही कनेक्शन का उपयोग करते हैं तो आपको अभी भी सही परिणाम देना चाहिए। इसके अलावा, mysql_num_rows भी मदद कर सकता है।

+0

यह केवल MySQL एक्सटेंशन के लिए सच है। Mysqli और PDO एकाधिक प्रश्नों की अनुमति देता है। –

3

SQL_CALC_FOUND_ROWS का उपयोग करके आप नहीं कर सकते।

FOUND_ROWS() के माध्यम से उपलब्ध पंक्ति गणना क्षणिक है और SELECT SQL_CALC_FOUND_ROWS कथन के बाद बयान के पीछे उपलब्ध नहीं है।

किसी रूप में अपने पहले प्रश्न में वर्णित है, का उपयोग कर SQL_CALC_FOUND_ROWS सिर्फ एक गिनती हो रही है की तुलना में अक्सर धीमी है।

शायद आप सबक्वेरी के रूप में के रूप में यह कर बंद सबसे अच्छा होगा:

SELECT 
(select count(*) from my_table WHERE Name LIKE '%prashant%') 
as total_rows, 
Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10; 
+0

SQL_CALC_FOUND_ROWS धीमा है, लेकिन http: //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows लिंक मैंने पाया "हालांकि, यह LIMIT के बिना फिर से क्वेरी चलाने से तेज़ है, क्योंकि परिणाम सेट को भेजने की आवश्यकता नहीं है क्लाइंट के लिए। "?? – Prashant

+1

लेकिन इस मामले में नहीं, क्योंकि क्वेरी इंडेक्स का उपयोग नहीं कर सकती है। SQL_CALC_FOUND_ROWS के परिणामस्वरूप एक टेबल स्कैन होगा, जबकि आपकी सबक्वायरी दो में परिणाम देगी, और इसलिए बहुत धीमी है। इसके अलावा, आप ' कुल_रो के बाद एक अल्पविराम भूल गया है। –

+1

हां, ठीक है, आप सीमा के बिना फिर से क्वेरी नहीं चला रहे हैं। आप एक पंक्ति (*) चला रहे हैं, जो एक पंक्ति भेजती है। वास्तव में, एमिल एच का एक अच्छा बिंदु है - यह है डु का एक माइक्रो अनुकूलन उत्सुक मूल्य। या तो दो प्रश्न चलाएं, या यदि आपको बिल्कुल यह करना है, तो इसे एक सबक्वायरी के रूप में करें जैसा मैंने समझाया है। (एमिल एच, टीएच गायब कॉमा को इंगित करने के लिए धन्यवाद।) – tpdi

3

आप MySQLi एक्सटेंशन का उपयोग करने के लिए यदि आप एक प्रश्न दो बार निष्पादित करने के लिए नहीं करना चाहती होगा:

if (mysqli_multi_query($link, $query)) 
{ 
    $result1 = mysqli_store_result($link); 
    $result2 = null; 

    if (mysqli_more_results($link)) 
    { 
     mysqli_next_result($link); 
     $result2 = mysqli_store_result($link); 
    } 

    // do something with both result sets. 

    if ($result1) 
     mysqli_free_result($result1); 

    if ($result2) 
     mysqli_free_result($result2); 
} 
2

आप, mysqli का उपयोग करना पड़ कोड अच्छी तरह से काम नीचे

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$query = "SELECT CURRENT_USER();"; 
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5"; 

/* execute multi query */ 
if ($mysqli->multi_query($query)) { 
    do { 
     /* store first result set */ 
     if ($result = $mysqli->store_result()) { 
      while ($row = $result->fetch_row()) { 
       printf("%s\n", $row[0]); 
      } 
      $result->free(); 
     } 
     /* print divider */ 
     if ($mysqli->more_results()) { 
      printf("-----------------\n"); 
     } 
    } while ($mysqli->next_result()); 
} 

/* close connection */ 
$mysqli->close(); 
?> 
7

के रूप में अन्य ने उत्तर दिया है, mysqli API msyqli_multi_query() फ़ंक्शन के साथ बहु-क्वेरी निष्पादित कर सकता है।

क्या इसके लायक है के लिए, पीडीओ डिफ़ॉल्ट रूप से बहु क्वेरी का समर्थन करता है, और आप अपने कई प्रश्नों के कई परिणाम सेट पर पुनरावृति कर सकते हैं:

$stmt = $dbh->prepare(" 
    select sql_calc_found_rows * from foo limit 1 ; 
    select found_rows()"); 
$stmt->execute(); 
do { 
    while ($row = $stmt->fetch()) { 
    print_r($row); 
    } 
} while ($stmt->nextRowset()); 

हालांकि, बहु क्वेरी बहुत व्यापक रूप से एक बुरा माना जाता है सुरक्षा कारणों से विचार। यदि आप अपने क्वेरी स्ट्रिंग्स को बनाने के बारे में सावधान नहीं हैं, तो आप वास्तव में classic "Little Bobby Tables" XKCD cartoon में दिखाए गए सटीक प्रकार की SQL इंजेक्शन भेद्यता प्राप्त कर सकते हैं। एक एपीआई का उपयोग करते समय जो आपको सिंगल-क्वेरी पर प्रतिबंधित करता है, ऐसा नहीं हो सकता है।

0

हां यह संभव है MySQLi एक्सटेंशन का उपयोग किये बिना।

mysql_connect के 5 वें तर्क में बस CLIENT_MULTI_STATEMENTS का उपयोग करें।

अधिक जानकारी के लिए Husni's post नीचे दी गई टिप्पणियों का संदर्भ लें।

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