我有一个不寻常的sql表(不是我的),其中包含以下字段(其中包括):last_name,primary_name,secondary_name,表示已婚夫妇.假设姓氏是共享的(不是很现代,我知道),如果它不是一对,那么primary_name或secondary_name可能是NULL. (该表也有几个重复.)
我想要做的是获取数据库中所有名称(“最后一个”)的列表,以通常的方式按字母顺序排列.现在我正在使用PHP和PDO对数据库进行两次传递:
- $qstr = "SELECT DISTINCT primary_name,last_name
- FROM members
- WHERE primary_name IS NOT null
- ORDER BY last_name,primary_name";
- $sth = $dbh->prepare($qstr);
- $sth->execute();
- // output the results
- $qstr = "SELECT DISTINCT secondary_name,last_name
- FROM members
- WHERE secondary_name IS NOT null
- ORDER BY last_name,secondary_name";
- $sth = $dbh->prepare($qstr);
- $sth->execute();
- // output the new results
但最终结果不是按字母顺序排列的,因为第二遍再次开始.
如何一次性获取所有名称,完全按字母顺序排列?有没有办法在sql中执行此操作,或者我是否需要构建两个数组并在PHP之后重新按字母顺序排列它们?
编辑
数据库看起来像这样:
- last_name primary_name secondary_name
- ----------------------------------------
- Abrams Joe Susan
- Miller Sam Abby
期望的输出将是这样的:
- ["Joe Abrams","Susan Abrams","Abby Miller","Sam Miller"]
相反,如果第一遍得到所有的丈夫,第二遍通过所有的妻子,我得到这样的东西:
- ["Joe Abrams","Sam Miller","Abby Miller"]
另一种方法是使用UNION ……
- SELECT
- *
- FROM
- (
- SELECT primary_name AS pri_sec_name,last_name
- FROM members
- WHERE primary_name IS NOT null
- UNION
- SELECT secondary_name AS pri_sec_name,last_name
- FROM members
- WHERE secondary_name IS NOT null
- )
- AS data
- ORDER BY
- last_name,pri_sec_name
注意:UNION(与UNION ALL相反)将重复删除结果.
另一种方法是在映射表上进行连接.
- SELECT
- members.last_name,CASE WHEN map.mode = 1 THEN members.primary_name ELSE members.secondary_name END AS pri_sec_name
- FROM
- members
- INNER JOIN
- (SELECT 1 as mode UNION ALL SELECT 2 as mode) AS map
- ON (map.mode = 1 AND members.primary_name IS NOT NULL)
- OR (map.mode = 2 AND members.secondary_name IS NOT NULL)
- ORDER BY
- 1,2