1

PHPのif条件を使用せずに、MySQLクエリを実行して特定の行を抽出しようとしています。

さて、
変数が特定の行にない行を選択したいのですが、これが

$blocked_user = "aaron";

とMySQLで

+----------+-----------------------+
| id       | blocked               |
+----------+-----------------------+
| 1        | aaron,john            |

誤った例を選択して処理するときに「aaron」をスキップしたい

SELECT * FROM table WHERE $blocked_user NOT IN blocked

私がやっていたのは、ブロックされたコンテンツを取得し、php explode関数を使用してそれらを分離し、次にin_arrayを使用して、そこにないことを確認するかどうかです。

if(in_array($blocked_user, explode($row['blocked'])){
  exit;
}

しかし今、私はこれを取り除き、単一のクエリを使用してそれを実行したいのですが、それはどのように行われますか?

4

4 に答える 4

4

実際には、各CSV値を異なる行(おそらくblockedテーブル)に配置する必要がありますが、実行できることは次のとおりです。

SELECT * 
FROM tbl
WHERE FIND_IN_SET('$blocked_user', blocked) = 0

$blocked_user列のCSVリストにが含まれている場合blocked、その行は選択されません。


SQLFiddleデモ

于 2012-07-25T17:43:36.123 に答える
1

探しているのはLEFTOUTERJOINだと思いますが、ブロックされた名前を別々の行に格納する必要があります。

例:

+----------+-----------------------+
| id       | blocked               |
+----------+-----------------------+
| 1        | aaron                 |
| 2        | john                  |

次に、次のようにユーザーテーブルでLEFTOUTERJOINを実行できます。

SELECT * FROM users AS u
LEFT JOIN blocked as b
ON b.blocked = u.username
WHERE b.blocked IS NULL
于 2012-07-25T17:46:10.600 に答える
1

ある種の高度な正規表現MySQLを実行できる可能性がありますが、問題はより深く設定されています。テーブルは実際には次のようになります。

| id | blocked |
----------------
| 1  |  aaron  |
| 1  |   john  |

もちろんid、主キータイプではありません。

次に、これを行うことができます:

SELECT * FROM table WHERE id = 1 AND blocked NOT IN ('aaron')

あなたの編集によると、あなたが2番目のテーブルを持っているなら、それを呼びましょうdata

SELECT * FROM data WHERE id = 1 AND id NOT IN (SELECT id FROM blocked_table WHERE blocked IN ('aaron'))
于 2012-07-25T17:39:23.033 に答える
0

あなたが試すことができます

$sql = "SELECT * FROM table WHERE blocked NOT LIKE '%{$blocked_user}%'";
于 2012-07-25T17:42:58.107 に答える