sql >> Databáze >  >> RDS >> Mysql

Vyberte nahrávku na základě meta

Chcete-li napsat tento dotaz pouze v SQL, napsali byste něco jako

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 klauzule je to, co tvrdí, že nahrávka má všechny zadané páry meta klíč a hodnota.

Chcete-li to přeložit do kódu PHP, musíte si vytvořit $where doložka podobným způsobem; Dávám přednost použití pole a implodování, abych si ušetřil starosti s koncovými AND a podobně. Ve stejnou dobu, kdy vytváříme tuto klauzuli, můžeme sestavit vstupy do 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();
}

Ukázku tvorby dotazů a generování parametrů naleznete zde .




  1. Získání automatického doplňování jQuery pro práci se zdrojem PHP

  2. Vyhledejte seznam *všech* datových sad SSRS napříč *všemi* sestavami SSRS na instanci ReportServeru

  3. Zdá se, že PHP foreach user script způsobí, že Apache zamrzne

  4. Proč byla požadována neplatná konverze KÓD CHYBY:17132?