首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -如果另一列中不存在重复或引用,则按一列进行排序

MySQL -如果另一列中不存在重复或引用,则按一列进行排序
EN

Stack Overflow用户
提问于 2014-11-25 17:31:59
回答 1查看 77关注 0票数 0

我有一张桌子看起来(简化)是这样的:

代码语言:javascript
复制
+----+--------------+-----------+----------------+----------------+--------+---------+
| ID | First name   | Last name | Street Address | Postal Address | Country | Spouse |
+----+--------------+-----------+----------------+----------------+---------+--------+
| 1  | Nancy        | Fuller    | Street 1       | City 1         | USA     | 4      |
| 2  | Andrew       | Davolio   | Way 2          | Town 2         | USA     | 0      |
| 3  | Janet        | Leverling | Blvd 3         | Village 3      | USA     | 0      |
| 4  | Steven       | Buchanan  | Street 1       | City 1         | USA     | 1      |
| 5  | Anne         | Dodsworth | Street 1       | City 1         | USA     | 0      |
+----+--------------+-----------+----------------+----------------+---------+--------+

正如你所看到的,南希和史蒂文结婚了(“配偶”一栏包含配偶的ID,如果有的话),并且住在一起。南希的妹妹安妮也和他们住在一起(别费心评论不便之处)。

现在我想打印这个数据库。我想按姓订购,但在打印页上我有两种选择:

  • 按地址分组
  • 按配偶分组

因此,有四种情况:

不分组

它们只是简单地按姓氏订购:

布坎南,史蒂文

达沃利奥

多德斯沃思

富勒,南希

勒弗林,珍妮特

按地址分组,当到达具有相同地址的几个地址中的第一个人时,所有这些人都被打印出来(仍然按组中的姓氏排序):

布坎南,史蒂文

多德斯沃思

富勒,南希

达沃利奥

勒弗林,珍妮特

按配偶分组,当到达夫妻中的第一个人时,两者都打印:

布坎南,史蒂文

富勒,南希

多德斯沃思

达沃利奥

勒弗林,珍妮特

由地址和组合而成,配偶是优先排序的(所以南希出现在安妮面前,因为她是史蒂夫的配偶)。

布坎南,史蒂文

富勒,南希

多德斯沃思

达沃利奥

勒弗林,珍妮特

我真的希望他们分组,如果可能的话,而不仅仅是按顺序排列。如上所示,我想要的是非分组人之间的空间,以及分组人之间的空间。这是否可能只使用MySQL,或者我也必须使用PHP?

(我使用PHP5.5.16和MySQL 5.5.39,PDO对象)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-25 20:12:05

在这个查询中,我将cast语句放在select部分,这样您就可以看到数据是如何布局的。如果你想要的话,你可以把它们移到顺序上,并且只取出名字,姓氏。

案件:按地址和配偶下令

代码语言:javascript
复制
SELECT DISTINCT 
    CASE WHEN p1.id IS NOT NULL THEN 1 ELSE 0 END, 
    CASE WHEN p2.id IS NOT NULL THEN 1 ELSE 0 END,
    CONCAT(p.lastname, ', ', p.firstname)
FROM people p
LEFT JOIN people p1 ON p1.spouse = p.id
LEFT JOIN people p2 ON p2.streetaddress = p.streetaddress 
                   AND p.postaladdress = p2.postaladdress 
                   AND p2.id <> p.id
ORDER BY 1 DESC, 2 DESC, 3 ASC;

案件:按地址下令

代码语言:javascript
复制
SELECT DISTINCT 
    CASE WHEN p2.id IS NOT NULL THEN 1 ELSE 0 END, 
    CONCAT(p.lastname, ', ', p.firstname)
FROM people p
LEFT JOIN people p2 
    ON p2.streetaddress = p.streetaddress 
   AND p.postaladdress = p2.postaladdress 
   AND p2.id <> p.id
ORDER BY 1 DESC, 2 ASC;

案件:由配偶下令

代码语言:javascript
复制
SELECT DISTINCT 
    CASE WHEN p1.id IS NOT NULL THEN 1 ELSE 0 END, 
    CONCAT(p.lastname, ', ', p.firstname)
FROM people p
LEFT JOIN people p1 ON p1.spouse = p.id
ORDER BY 1 DESC, 2 ASC;

案例:无定单

代码语言:javascript
复制
SELECT
    CONCAT(p.lastname, ', ', p.firstname)
FROM people p;

小提琴演示

注意:如果您保持按顺序选择,那么您可以很容易地在应用层中添加空格.例如,如果它取出一个1,那么这就意味着,对于配偶,地址等等,如果它是0,那么它是假的。因此,您可以检查值,如果是0,则开始添加空格。

编辑:

在MySQL中不可能按名称升序,但使用另一个名称(即配偶或相同地址)覆盖它。如果有配偶或没有配偶,您可以使用CASE语句签入php,并在那里更改顺序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27133068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档