Php MYSQL按第二个表排序

Php MYSQL按第二个表排序,php,mysql,Php,Mysql,我有一个名为properties的表,我想获取该表中所有与“hold=1”匹配的记录,但有一个额外的表包含不同语言的属性名称,我需要获取英语语言,如果不存在,则将语言标记作为默认值 表属性: pid hold 物业管理局: pid lang_id pname description isDefault 我通常用一个联合体来学习语言 (select pname from property_translations where lang_id='en' a

我有一个名为properties的表,我想获取该表中所有与“hold=1”匹配的记录,但有一个额外的表包含不同语言的属性名称,我需要获取英语语言,如果不存在,则将语言标记作为默认值

表属性:

pid     hold
物业管理局:

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
尝试:

尝试:


如果您的
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
的有效性,只是演示如何在第二个表中添加检查。

如果您的
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 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

请注意,我没有检查您的原始
选择的有效性,只是显示如何在第二个表中添加检查。

但是如果英语没有标记为默认值怎么办?英语不会标记为默认值,它是显示的默认值,但是如果英语不存在,其他语言之间会标记默认值,但是如果英语没有标记为默认值呢?英语不会标记为默认值,它是显示的默认值,但是如果英语不存在,其他语言之间会标记默认值谢谢这对我有用,它返回hold=1的所有属性,并获得所需的pname,如果不存在则为英语标记为默认值感谢这对我有用,它返回hold=1的所有属性,并获得所需的pname,如果不存在则为英语标记为默认值
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