इस क्वेरी को केवल 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();
}
क्वेरी फॉर्मेशन और पैराम्स जनरेशन का डेमो यहां पाया जा सकता है। ।