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. SQLAlchemyパスワードが提供されていませんエラー

    2. openprojectのデータを失うことなくpostgresqlデータベースを10から12にアップグレードする方法

    3. MySQLチュートリアル– MySQLサーバーログの管理:回転、圧縮、保持、削除

    4. SQLiteデータベースをCSVファイルにエクスポート