mysql
  • select
  • 2013-04-27 3 views 28 likes 
    28

    でクエリを選択します。私のコードに間違いはありますか?MySQLの結果が空であるので、私はMySQLのクエリを書かれているが、それは動作していないようです複数の条件

    $result = mysql_query(
        "SELECT user_id 
         FROM wp_usermeta 
         WHERE 
         (meta_key = 'first_name' AND meta_value = '$us_name') AND   
         (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') AND 
         (meta_key = 'u_city' AND meta_value = '$us_reg') AND 
         (meta_key = 'us_course' AND meta_value = '$us_course')" 
    ); 
    
    +1

    同じ列( 'meta_key')に複数の異なる値を同時に設定するとどうでしょうか? [**新しいコードでは、使用しないでください 'mysql_ *'機能**](http://bit.ly/phpmsql)。彼らはもはや維持されている[正式に廃止されました](https://wiki.php.net/rfc/mysql_deprecation)。 [** red box **](http://j.mp/Te9zIL)を参照してください。代わりに[* prepared statements *](http://j.mp/T9hLWi)について学び、[PDO](http://php.net/pdo)または[MySQLi](http://php.net/ mysqli) - [この記事](http:// j。mp/QEx8IB)はどちらを決定するのに役立ちます。 PDOを選んだら、[こちらは良いチュートリアルです](http://j.mp/PoWehJ)。 – DCoder

    答えて

    -2

    あなたは、相互に排他的な条件を持っている - meta_keyは「first_nameの」の場合、それはまた、「yearofpassing」にすることはできません。ほとんどの場合、あなたのANDはORである必要があります:

    $result = mysql_query("SELECT user_id FROM wp_usermeta 
    WHERE (meta_key = 'first_name' AND meta_value = '$us_name') 
    OR (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') 
    OR (meta_key = 'u_city' AND meta_value = '$us_reg') 
    OR (meta_key = 'us_course' AND meta_value = '$us_course')") 
    
    +0

    OPが望むのは、*すべての4つの*メタを持つ 'user_id'です。それは各条件に対して 'INNER JOIN'を必要とします。 (このテーブル構造は[Entity-Attribute-Value](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)、またはEAVと呼ばれます) – DCoder

    +0

    OR複数のユーザーが、私はこれらの値で正確なユーザーが欲しいです。 meta_keyは異なる列であり、メタ値はワードプレスの異なる列です –

    +0

    クエリは正しいですが、これは問題ではありません。 – Kovge

    21

    @fthiellaのソリューションは非常にエレガントです。

    将来的にあなたが使用できる以上user_idを表示したい場合には、参加して、1行に必要なすべてのデータがある可能性があります。

    あなたがAND条件を使用したい、との条件があなたのテーブルに複数の行にある場合は、JOINS例使用することができます。

    SELECT `w_name`.`user_id` 
        FROM `wp_usermeta` as `w_name` 
        JOIN `wp_usermeta` as `w_year` ON `w_name`.`user_id`=`w_year`.`user_id` 
          AND `w_name`.`meta_key` = 'first_name' 
          AND `w_year`.`meta_key` = 'yearofpassing' 
        JOIN `wp_usermeta` as `w_city` ON `w_name`.`user_id`=`w_city`.user_id 
          AND `w_city`.`meta_key` = 'u_city' 
        JOIN `wp_usermeta` as `w_course` ON `w_name`.`user_id`=`w_course`.`user_id` 
          AND `w_course`.`meta_key` = 'us_course' 
        WHERE 
         `w_name`.`meta_value` = '$us_name' AND   
         `w_year`.meta_value = '$us_yearselect' AND 
         `w_city`.`meta_value` = '$us_reg' AND 
         `w_course`.`meta_value` = '$us_course' 
    

    他の事:mysql_*機能ではないため、プリペアドステートメントを使用することをお勧めしますがSQLインジェクションは保存され、廃止予定です。 あなたが可能な限り少ないコードを変更したい場合は、mysqli_機能を使用することができます。 http://php.net/manual/en/book.mysqli.php

    推奨事項:この表の

    使用インデックス。 user_idは、高度になり、インデックス、およびクエリの実行速度のために、あまりにもmeta_keymeta_valueことをお勧めすることをお勧めします。

    説明:

    あなたは1行のための条件を「接続」ANDを使用している場合。したがって、複数の行をAND条件にしたい場合は、まずこのように複数の行から1行を作成する必要があります。

    テスト: 表データ:

      PRIMARY     INDEX 
         int  varchar(255) varchar(255) 
        /    \   | 
        +---------+---------------+-----------+ 
        | user_id | meta_key  | meta_value| 
        +---------+---------------+-----------+ 
        | 1  | first_name | Kovge  | 
        +---------+---------------+-----------+ 
        | 1  | yearofpassing | 2012  | 
        +---------+---------------+-----------+ 
        | 1  | u_city  | GaPa  | 
        +---------+---------------+-----------+ 
        | 1  | us_course  | PHP  | 
        +---------+---------------+-----------+ 
    

    $us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa'$us_course='PHP'とクエリの結果:

    +---------+ 
    | user_id | 
    +---------+ 
    | 1  | 
    +---------+ 
    

    だから、それが必要な作品。

    +0

    なぜこれがダウン表示されたのですか?これは正しい答えです。この場合、ジョインは方法です。 – DCoder

    +0

    他の回答が質問を理解しなかったので、 – Kovge

    +0

    は動作していないようです。 –

    32

    私はこのクエリを使用します。

    SELECT 
        user_id 
    FROM 
        wp_usermeta 
    WHERE 
        (meta_key = 'first_name' AND meta_value = '$us_name') OR 
        (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') OR 
        (meta_key = 'u_city' AND meta_value = '$us_reg') OR 
        (meta_key = 'us_course' AND meta_value = '$us_course') 
    GROUP BY 
        user_id 
    HAVING 
        COUNT(DISTINCT meta_key)=4 
    

    これはすべての4つの条件を満たしていることすべてuser_idを選択します。あなたは両方の属性を適用する場合は

    0

    また、あなたが使う「AND」の代わりに「OR」することができます。

    select * from tickets where (assigned_to='1') and (status='open') order by created_at desc; 
    
    関連する問題