mysql查询 - 不要在多个(5)列中显示重复项?

时间:2012-01-20 23:14:39

标签: php mysql sql

这有很多线程,但我似乎找不到可行的解决方案。这是我的查询:

 $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!=''不显示空单元格。

有什么想法吗?如果我需要提供更多信息,请告诉我。

4 个答案:

答案 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的所有人。

希望有所帮助!