1

プロパティという名前のテーブルがあります。このテーブル内の "hold=1" に一致するすべてのレコードを取得したいのですが、別のテーブルにさまざまな言語のプロパティ名が保持されています。

テーブル プロパティ:

pid     hold

property_translations:

pid     lang_id     pname     description     isDefault

私は通常、共用体を使用して言語を取得します

(select pname from property_translations where lang_id='en' and pid=$pid)
union
(select pname from property_translations where isDefault='Yes' and pid=$pid)
limit 1
4

4 に答える 4

1
SELECT p.pid, t.pname FROM properties p LEFT OUTER JOIN translations t ON p.pid = t.pid
    WHERE p.hold=1 AND t.isDefault='Yes' AND NOT EXISTS
    ( SELECT * FROM translations ti WHERE ti.pid = p.pid AND ti.lang_id='en')
    UNION SELECT p.pid, t.pname FROM properties p 
    LEFT OUTER JOIN translations t ON p.pid = t.pid
    WHERE p.hold=1 AND t.lang_id='en';
于 2012-09-07T23:33:52.190 に答える
0

試す:

   SELECT pt.pname
     FROM property_translations AS pt
LEFT JOIN properties AS p ON p.pid = pt.pid
    WHERE pt.pid = $pid
      AND p.hold = 1
      AND pt.lang_id='en'
      AND isDefault='Yes'
于 2012-09-07T23:34:10.640 に答える
0

目的selectの結果が得られ、それらを でフィルタリングしたいhold=1場合は、最初のテーブルを結合するだけです。

(select pname from property_translations t
              join properties p on (t.pid=p.pid and p.hold = 1)
              where lang_id='en' and pid=$pid)
union
(select pname from property_translations t
              join properties p on (t.pid=p.pid and p.hold = 1)
              where isDefault='Yes' and pid=$pid
              and not exists (select 1 from property_translations t2
                              where t2.pid=t.pid and t2.lang_id='en' and t2.isDefault='Yes'))

元の の有効性をチェックしていないことに注意してくださいselect。2 番目のテーブルに対してチェックを追加する方法を示しているだけです。

于 2012-09-07T23:37:57.897 に答える
0
SELECT p.pid pid, pname
from properties p
JOIN (SELECT t1.pid tpid, IFNULL(t2.pname, t1.pname) pname
      FROM translations t1
      LEFT OUTER JOIN translations t2
      ON t1.pid = t2.pid
      AND t2.lang_id = 'en'
      WHERE t1.isDefault = 'Yes') t
ON p.pid = t.pid
WHERE p.hold = 1
于 2012-09-08T00:29:19.603 に答える