Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

मेटा के आधार पर एक रिकॉर्डिंग का चयन करें

इस क्वेरी को केवल SQL में लिखने के लिए, आप कुछ इस तरह लिखेंगे

SELECT r.id
FROM recording r
JOIN meta m ON m.recording_id = r.id
           AND (m.meta_key = 'key1' AND m.meta_value = 'value1'
             OR m.meta_key = 'key2' AND m.meta_value = 'value2'
             OR m.meta_key = 'key3' AND m.meta_value = 'value3'
                ...)
GROUP BY r.id
HAVING COUNT(*) = <count of all key/value pairs>
LIMIT 10

HAVING क्लॉज वह है जो दावा करता है कि एक रिकॉर्डिंग में सभी निर्दिष्ट मेटा कुंजी और मूल्य जोड़े हैं।

इसे अपने PHP कोड में अनुवाद करने के लिए, आपको अपना $where बनाना होगा एक समान तरीके से खंड; मैं एक सरणी का उपयोग करना पसंद करता हूं और AND के पीछे होने की चिंता से बचने के लिए इंप्लोडिंग करना पसंद करता हूं और जैसे। उसी समय जब हम उस क्लॉज का निर्माण कर रहे हैं, हम इनपुट को bind_param में बना सकते हैं :

$join = array();
$params = array();
$types = '';
foreach ($metas as $key => $value) {
    $join[] = 'm.meta_key=? AND m.meta_value=?';
    $params[] = $key;
    $params[] = $value;
    $types .= 'ss';
}
// add the parameter for the `HAVING` check
$params[] = count($metas);
$types .= 'i';
// add the limit
$params[] = $limit;
$types .= 'i';
// make the query string
$sql = "SELECT recording_id 
        FROM {$config->recording_table} r
        JOIN {$config->meta_table} m ON m.recording_id = r.id
         AND (" . implode(' OR ', $join) . ")
        GROUP BY r.id
        HAVING COUNT(*) = ?
        LIMIT ?";
$stmt = $connection->prepare($sql);
if (!$stmt) {
    echo "Prepare failed: " . $conn->error . "\n";
    die();
}
$stmt->bind_param($types, ...$params);
if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error . " \r\n";
    die();
}

क्वेरी फॉर्मेशन और पैराम्स जनरेशन का डेमो यहां पाया जा सकता है। ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डालने से पहले पहले से मौजूद रिकॉर्ड की जांच करने का सबसे तेज़ तरीका [mysql_errno ()]

  2. क्या MySQL में अनुक्रमित दृश्य होना संभव है?

  3. नया EntityManager कभी-कभी MySQL से पुराना डेटा प्राप्त करता है

  4. टेबल-लेवल लॉकिंग बड़ी टेबल के लिए रो-लेवल लॉकिंग से बेहतर क्यों है?

  5. जब मैं स्कीमा पूछता हूं तो MySQL उतार-चढ़ाव वाली पंक्ति गणना देता है?