3

MySQLIFまたはCASE構文の使用に問題があります

手順は次のようになります。

MySQL クエリを呼び出す PHP プロジェクトがあります。たとえば、PHP が variable を渡すとしますX

そうXでない場合は0、次のようなクエリを実行する必要があります。

SELECT * FROM table
WHERE id = X

しかし、もしそうXなら0。次に、クエリを実行してすべてのレコードを選択する必要があります。

SELECT * FROM table

PHP の条件の結果に基づいて別の MySQL クエリを呼び出す条件を PHP に設定したくありません。渡された変数に基づいて SQL クエリ内で if/else 条件が実行されるようにしますX

4

2 に答える 2

3
SELECT * FROM table
WHERE $x = 0 or id = $x
于 2013-10-16T10:02:01.237 に答える
1

$x私はあなたのPHPから派生していると仮定します:

SELECT * FROM t WHERE IF($x=0, 1, id=$x)

(これは一般的な考え方を示すためのものであり、インジェクションなどを自分で処理する必要があります)

編集

ここで別の回答で素敵なコードを見つけました。だから私は興味がありました-どちらが速いですか? 今、私もそれが「幸せ」です:

私のバージョン:

mysql> @@バージョンを選択;
+---------+
| | @@バージョン |
+---------+
| | 5.5.27 |
+---------+
セットで 1 行 (0.00 秒)

次に、データをテストします。

mysql> select * from test;
+----+---------+
| | ID | タイトル |
+----+---------+
| | 1 | ふ |
| | 3 | t |
| | 4 | s |
+----+---------+
3行セット (0.02秒)

そしてテスト:

最初: IF 比較

mysql> @x を選択します。
+--------+
| | @x |
+--------+
| | t |
+--------+
セットで 1 行 (0.00 秒)

mysql> テストからベンチマーク(1E7, if(@x=0, 1, title=@x)) を選択;
+-----------------------------------------------------+
| | ベンチマーク(1E7, if(@x=0, 1, title=@x)) |
+-----------------------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+-----------------------------------------------------+
3 行セット (1.66 秒)

mysql> @x=0 を設定します。
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql> テストからベンチマーク(1E7, if(@x=0, 1, title=@x)) を選択;
+-----------------------------------------------------+
| | ベンチマーク(1E7, if(@x=0, 1, title=@x)) |
+-----------------------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+-----------------------------------------------------+
3 行セット (1.85 秒)

2番目、OR比較

mysql> @x を選択します。
+--------+
| | @x |
+--------+
| | 0 |
+--------+
セットで 1 行 (0.00 秒)

mysql> テストからベンチマーク (1E7、タイトル = @X または @X = 0) を選択します。
+----------------------------------------------------+
| | ベンチマーク(1E7、タイトル = @X または @X = 0) |
+----------------------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+----------------------------------------------------+
3 行セット、65535 件の警告 (17.31 秒)

-わかりました、それは型キャストが原因でした。修正:

mysql> @x='0' を設定します。
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql> テストからベンチマーク (1E7、タイトル = @X または @X = '0') を選択します。
+----------------------------------------+
| | ベンチマーク (1E7、タイトル = @X または @X = '0') |
+----------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+----------------------------------------+
3 行セット (5.78 秒)

そして最後に、非ゼロ:

mysql> @x='t' を設定します。
クエリ OK、影響を受ける行は 0 (0.00 秒)

mysql> テストからベンチマーク (1E7、タイトル = @X または @X = '0') を選択します。
+----------------------------------------+
| | ベンチマーク (1E7、タイトル = @X または @X = '0') |
+----------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+----------------------------------------+
3 行セット (4.92 秒)

結論

IFORこの場合の比較は、 (1E7 ベンチマークの反復で約 3 倍)よりもはるかに高速であるように思われます。

于 2013-10-16T10:04:31.387 に答える