1

特定のデータベースを操作する必要があります。

この記事を見つけましたが、私のニーズに合わせることができませんでした:

http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx

私がしたいこと

私は MYSQL 5 と PHP 5.4 を使用しています。

データベースには、単一の行と同じ件名のローカライズされたエントリがあります。

テーブルの構造

+---+--------+------------+--------+----+-----+  
|id |a       |b           |c       |d   |e    |  
+---+--------+------------+--------+----+-----+  
|1  |aaa     |German text |booked  |0   |1    |  
+---+--------+------------+--------+----+-----+  
|2  |aaa     |English text|booked  |1   |0.25 |  
+---+--------+------------+--------+----+-----+  
|3  |aaa     |French text |booked  |2   |1    |  
+---+--------+------------+--------+----+-----+  
|4  |bbb     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|5  |bbb     |French text |booked  |2   |1    |  
+---+--------+------------+--------+----+-----+  
|6  |ccc     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|7  |ccc     |English text|free    |1   |0.5  |  
+---+--------+------------+--------+----+-----+  
|8  |ddd     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|9  |ddd     |Russian text|booked  |5   |0.9  |  
+---+--------+------------+--------+----+-----+  
|10 |eee     |Italian text|free    |4   |1.2  |  
+---+--------+------------+--------+----+-----+  
|11 |eee     |English text|free    |1   |0.3  |  
+---+--------+------------+--------+----+-----+  

列:

a = subject  
b = localized text  
c = value  
d = language-key  
e = value  

列「d」をチェックするために、最大 3 つの異なる言語値があります。

  • request_value (最初の選択肢、TRUE の場合は subject1 のこの行を取得)
  • fallback_value (request_value が失敗した場合はこれを確認し、TRUE の場合は subject1 のこの行を取得します)
  • default_value (request_value と fallback_value が失敗した場合はこれをチェックし、TRUE の場合は subject1 のこの行を取得します)
  • 3 つのチェックがすべて失敗した場合、subject1 の行は返されません。

すべての subject1 エントリの 1 つの行のみが返されるか、まったく返されない必要があります。

リクエストの例

request_value = 0 (German)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 1, 4, 6, 8, 11  


request_value = 1 (English)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 2, 4, 7, 8, 11  


request_value = 5 (Russian)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 2, 4, 7, 9, 11  

WHERE ステートメントで条件を考え、CASE ステートメントを避けたいと考えています。

クエリ (プロトタイピング):

SELECT a, b  
FROM table  
WHERE  
c = value1  
AND (check conditions for d)  
AND e > 0  

これが避けられない場合は、CASEステートメントを使用しても、WHEREステートメントを誰かに教えてもらえますか?

テーブルをフィルタリングするためのより良い (またはより高速な) 方法はありますか?

前もって感謝します。

4

1 に答える 1

1

あなたがやろうとしていることは、記事の内容とは大きく異なります。記事では、caseステートメントを使用せずに単一の行で条件を書き換える方法を教えています。一方、タスクには、複数の行にわたって機能する必要がある条件が必要です。つまり、記事の条件は横型ですが、あなたは縦型を探しています。

1 つの行を選択するクエリを作成する 1 つの方法は、 を使用することCOALESCEです。tableと呼ばれる主キーがあると仮定すると、次のidように実行できます。

-- Change these values as needed
SET @request_value = 5;
SET @fallback_value = 1;
SET @default_value = 0;

SELECT id
FROM test a
WHERE id = COALESCE (
  (SELECT ID FROM test b WHERE a.a=b.a AND d=@request_value)
, (SELECT ID FROM test b WHERE a.a=b.a AND d=@fallback_value)
, (SELECT ID FROM test b WHERE a.a=b.a AND d=@default_value)
)

これはsqlfiddleのデモです。

これが機能するためには、各個人SELECTが最大で 1 つの行を返さなければならないことに注意してください。あなたの場合、 の任意の組み合わせに対して複数の行が存在してはなりません{a, d}

于 2013-06-15T12:53:44.720 に答える