0

私の MySQL データベースでは、テーブルs_p(id, name, prod_id) にデータを英語で保存し、別のテーブルs_p_l(id,prod_id,name,locale) に製品のローカライズされた名前 (利用可能な場合) を保存します。

現時点で私が使用している

SELECT name FROM s_p_l WHERE prod_id=2 AND locale="de_DE";

最初に製品 #2 のローカライズされた名前があるかどうかを確認し、行が返されない場合は、

SELECT name FROM s_p WHERE prod_id=2;

英語名を取得します。

製品 ID とロケール、ローカライズされた製品名と英語の製品名をフォールバックとして指定すると、1 つのクエリで取得するにはどうすればよいですか?

(はい、SQL インジェクションを避けるために準備済みステートメントを使用しています)

4

2 に答える 2

1

左外部結合の仕事のように聞こえます。テーブルから選択しますs_p(値がそこにあることがわかっているため) が、テーブルに左外部結合を実行しますs_p_ls_p_lレコードがない場合は、s_p_l列の null を取得するだけですが、一致するすべての行を から取得しますs_p

SELECT
  s_p_l.name AS localizedName,
  s_p.name as fallbackName
FROM
  s_p
  LEFT OUTER JOIN s_p_l ON
    s_p_l.prod_id = s_p.prod_id AND
    s_p_l.locale = "de_DE"
WHERE s_p.prod_id = 2

おそらく SELECT を変更して、1 つの列だけを返すこともできます: SELECT ISNULL(s_p_l.name, s_p.name). (私のバックグラウンドは SQL Server ですが、これは mySQL で動作する標準 SQL だと思います。)

于 2013-02-10T05:18:52.283 に答える
0

使用も検討できUNIONます。

SELECT name FROM s_p_l WHERE prod_id=2 AND locale="de_DE"
union
SELECT name FROM s_p WHERE prod_id=2;

SQLFIDDLE デモ


編集

ローカル言語 ( ) で存在する場合に英語の値を表示したくない場合はs_p_l、次のクエリを使用します。

SELECT * FROM 
(
   SELECT name FROM s_p_l WHERE prod_id=2 AND locale="de_DE"
   UNION
   SELECT name FROM s_p WHERE prod_id=2) b
LIMIT 1
;

SQLFIDDLE デモ

于 2013-02-10T05:27:08.333 に答える