0

私は次の表を持っています

id  blocked  blocker
1     2        1
2     4        2
3     xx       xx
4     xx       xx

ID 2を提供するとします

1- 1 番目と 2 番目の両方の結果が出力されるクエリを実行したい。

次のクエリを使用しています

$statement = $conn->prepare('SELECT * FROM blocks WHERE blocker = :blocker OR blocked=:blocked'); 

これは機能しますか?

これらのエントリの配列を取得したら、

$row = $statement->fetchAll(PDO::FETCH_ASSOC)

注: 上記の例では代替値、つまり 1 と 4 が必要なため、すべての行を取得する必要があります。

2 番目に上記の結果を使用すると、別のテーブル ユーザーがいます。1 と 4 を除くすべてのエントリを取得するクエリを実行したい (REFER TO TABLE ABOVE) が出力されます

id  username  password etc
1
2
3
4

サーバー リソースをあまり使用せずにこれら 2 つのクエリを実行するにはどうすればよいでしょうか。

4

1 に答える 1

0

最初のクエリが間違っています... 1と2の両方を返すOR代わりにを使用する必要があります。AND

SELECT * FROM blocks WHERE blocker = :blocker OR blocked=:blocked

これで、結合を使用して、1つのクエリで必要なすべてのデータを取得できます。

 SELECT u.*, b.* FROM blocks b, users u 
 WHERE (
    b.blocker = :blocker OR b.blocked=:blocked
 ) AND (
   u.id = b.blocker
   OR u.id = b.blocked
 )

これにより、1人のユーザーに対応する2つの行が表示される可能性があることに注意してください。たとえば、結果は次のようになります。

id username password etc id blocked blocker
1  user1    *******  **  1   2       1
2  user2    *******  **  1   2       1
2  user2    *******  **  2   4       2

実際に誰が誰によってブロックされたのかを確認していない場合は、ブロックデータを選択する必要はなく、ユーザーをグループ化または区別して、それぞれのインスタンスを1つだけ取得できます。

 SELECT DISTINCT u.* FROM users u, blocks b 
 WHERE (
    b.blocker = :blocker OR b.blocked=:blocked
 ) AND (
   u.id = b.blocker
   OR u.id = b.blocked
 )

これにより、次のような結果が得られます。

id username password etc
1  user1    *******  **
2  user2    *******  **
于 2013-03-06T15:57:37.860 に答える