这有很多线程,但我似乎找不到可行的解决方案。这是我的查询:
$sql = "SELECT DISTINCT `People`,`People2`,`People3`,`People4`,`People5`
FROM `album1`
WHERE `People` != '' ORDER BY `People`";
我遇到了多个问题。首先,重复仍在显示。另外,我无法弄清楚如何在多列上进行WHERE
...
例如,表格如下所示。
People | People2 | People3 | People4 | People5
--------+----------+---------+---------+--------
Alex | Frank | | | John
Alex | | John | Frank |
它们主要用于“标记”照片。由于可以在5个人输入字段中的任何一个中输入人名,因此名称最终会到处。
我正在做的就是试着让名字出现一次。 People
!=''不显示空单元格。
有什么想法吗?如果我需要提供更多信息,请告诉我。
答案 0 :(得分:4)
您应该对此进行非规范化,因此您只有一个People
列。您可能应该将其称为Person
以强调其奇点。
但是,如果由于某种原因无法在数据模型中执行此操作,则可以执行此操作。它创建了一个虚拟单Person
列。
SELECT DISTINCT People as Person, Place, Year, Filename, Orientation
FROM (
SELECT People AS People, Place, Year, Filename, Orientation
FROM ALBUM1
WHERE People IS NOT NULL and People <> ''
UNION ALL
SELECT People1 AS People, Place, Year, Filename, Orientation
FROM ALBUM1
WHERE People1 IS NOT NULL and People1 <> ''
UNION ALL
SELECT People2 AS People, Place, Year, Filename, Orientation
FROM ALBUM1
WHERE People2 IS NOT NULL and People2 <> ''
/* etc */
)a
ORDER BY People, Place, Year, Filename, Orientation
答案 1 :(得分:0)
首先,“distinct”仅适用于整个结果行,因此当您选择3列时,它们只是组合不同,例如结果行“A,B,C和”A,A,B“是不同,但另一个“A,B,C”将被驳回。
所以,假设您想要生成相册中所有人的列表(如果我错了,请纠正我),您需要将所有列组合在一起以使DISTINCT正常工作,UNION浮现在脑海中:
select people from album where...
UNION DISTINCT
select people2 from album where...
UNION DISTINCT
select people3 from album where...
(你真的不需要在union-clause中声明DISTINCT,因为它是默认行为)
这会将所有“人员”列连接到DISTINCT可以操作的单个列表。
另一方面,其他评论者和答案是正确的,你应该将其正常化。
答案 2 :(得分:0)
尝试这样的事情(它将删除空白列),但是,我非常同意Jon C,这是一个 解决方法 ,用于不正确的数据库设计。 ..
select id,max(people) as People,max(people2) as Pep2,
max(people3) as Pep3,max(people4) as Pep4,max(people5) as Pep5
from
(
select id,people,'' as People2,'' as People3,'' as People4,'' as People5
from dbo.album
where people <> ''
union
select id,'',people2,'','',''
from dbo.album
where people2 <> ''
union
select id,'','',people3,'',''
from dbo.album
where people3 <> ''
union
select id,'','','',people4,''
from dbo.album
where people4 <> ''
union
select id,'','','','',people5
from dbo.album
where people5 <> ''
) xx
group by id
答案 3 :(得分:0)
我会采取一种完全不同的方法:如果为这么简单的任务编写一个sql太困难/太复杂 - 那么表格结构可能会有所不同!
如果我理解正确,你想要实现的是显示“谁标记了谁”,意思是,你总是希望第一列(人)是!= NULL,然后你想要的信息来自其他列(ppl2,ppl3 ...)不是NULL。
如果这是正确的,那么我会改变这个表的结构只保留两列:“tagger”和“tagged”。 根本不需要所有其他列,因为每行只代表一个标记另一个人的人。
通过此实现,您可以轻松选择Mark标记的所有人或标记Robert的所有人。
希望有所帮助!