我有一张桌子看起来(简化)是这样的:
+----+--------------+-----------+----------------+----------------+--------+---------+
| 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对象)
发布于 2014-11-25 20:12:05
在这个查询中,我将cast语句放在select部分,这样您就可以看到数据是如何布局的。如果你想要的话,你可以把它们移到顺序上,并且只取出名字,姓氏。
案件:按地址和配偶下令
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;案件:按地址下令
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;案件:由配偶下令
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;案例:无定单
SELECT
CONCAT(p.lastname, ', ', p.firstname)
FROM people p;小提琴演示
注意:如果您保持按顺序选择,那么您可以很容易地在应用层中添加空格.例如,如果它取出一个1,那么这就意味着,对于配偶,地址等等,如果它是0,那么它是假的。因此,您可以检查值,如果是0,则开始添加空格。
编辑:
在MySQL中不可能按名称升序,但使用另一个名称(即配偶或相同地址)覆盖它。如果有配偶或没有配偶,您可以使用CASE语句签入php,并在那里更改顺序。
https://stackoverflow.com/questions/27133068
复制相似问题