2017-06-30 5 views
1

私は、各ユーザーに関連する値が異なる行に分散しているワードプレスのmySQLデータベースを照会しようとしています(なぜ神がそれをやったのかを知っています。行)たとえば異なる行にまたがるMySqlステートメント

ここであなたは、各行が同じユーザーに対してFIELD_IDに基づいて異なる意味のn

FIELD_ID=2 contains the user name 
FIELD_ID=3 contains mean what they bought 
FIELD_ID=4 means logged in 
FIELD_ID=5 is busy or idle 

Iを持って見ることができます

ID USER_ID FIELD_ID VALUE 
1  1  2  my name is paul smith 
2  1  3  books 
3  1  4  loggedin 
4  1  5  state=busy 
5  2  2  my name is big boy 
5  2  3  pens 
6  2  4  offline 
7  2  5  state=idle 

INとSTATE = IDLEをログインしBOOKSを買った(あるいは、彼らが検索したいものは何でもペンのようないくつかの他のアイテムを購入)されているすべてのユーザーを返しますONEクエリ

を作るためのEEDはので、私はこのPHPの声明

で始まりました
$find="pens"; 

    $q = "SELECT * FROM table 
      WHERE FIELD_ID='4' AND VALUE='loggedin' 
      AND FIELD_ID='5' AND VALUE='idle' 
      AND USER_ID IN 
       (SELECT USER_ID FROM table WHERE FIELD_ID ='3' AND VALUE LIKE '%$find%') 

しかし、私はそれらがどのように異なる行に同時に FIELD_ID =「4」AND VALUE =「LOGGEDIN」AND FIELD_ID =「5」AND VALUE =「アイドル」の全てです可能性があるためので、これが動作すると思いますいけません。

誰かがそれを行うために1つのmySQL文を作成する方法を知っていますか?彼らはしたくなかったので -

+3

に参加しますダムの静的システムですが、データベース構造を常に変更することなく、プラグインが必要に応じて追加のプロパティを簡単に追加できる場所です。それは、神がすべての賢明な開発者に同意するものです。 – CBroe

+0

問題を解決するには、ユーザーIDごとにグループ化し、WHERE句を使用して条件の1つに一致するすべてのレコードを選択します(したがって、ORではない)。そして最後にHAVINGを使用して、グループ化されたデータは、照合している基準の数と一致します。 – CBroe

+0

はANDの代わりにORを使用し、FEILD_IDの値を探すだけでVALUEの値は必要ありません –

答えて

0

あなたは自己を使用することができますが、「(彼らはそれを彼らはただ1行上のすべてのユーザー情報を入れてdidntのなぜそのように、やった理由だけで神が知っている)、」_を_

SELECT distinct a.user_id 
    FROM table a 
    inner join table b on a.user_id = b.user_id and b.field_id = 5 and b.value='idle' 
    inner join table c on a.user_id = c.user_id and c.field_id = 4 and c.value = 'loggedin' 
    where a.field_id=3 and a.value='BOOK' 
+0

私はそれを試してくれます! –

+0

scaisEdge、コメントありがとうございますが、あなたのSQLステートメントはログイン状態をacountに持っていません。LOGGED INとSTATE = IDLEでBOOKS、3つのANDEDを一緒に買ったすべてのユーザーを返さなければなりませんが、あなたがログインしたことを確認するのを忘れてしまった場合は、もう1つ投稿できますか?おかげで –

+0

ありがとう非常にscaisEdge、私はそれを試してみましょう! –

関連する問題