加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 我可以让SQL查询在每一行上做两个匹配吗?

发布时间:2020-12-13 14:10:17 所属栏目:PHP教程 来源:网络整理
导读:我有一个不寻常的SQL表(不是我的),其中包含以下字段(其中包括):last_name,primary_name,secondary_name,表示已婚夫妇.假设姓氏是共享的(不是很现代,我知道),如果它不是一对,那么primary_name或secondary_name可能是NULL. (该表也有几个重复.) 我想要做的是
我有一个不寻常的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读