首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询重复结果

问SQL查询重复结果
EN

Stack Overflow用户
提问于 2013-02-07 20:46:37
回答 2查看 82关注 0票数 0

我正在使用MySQL 5进行一个项目。要求如下:

给出用户名称、设备类型、操作系统版本和与where相关的结果,其中用户具有相同的设备类型,运行iOS 4或4.1,并选择相同的水果。

有关的表格如下:

用户:{uID:INT,名称: VARCHAR(45),deviceOS: VARCHAR(45),deviceType: VARCHAR(45)} 精选:{uID:INT,ts:TIMESTAMP,果树: VARCHAR(45)} (主键以粗体表示。uID是uID在用户中的外键。

我正在执行以下查询:

代码语言:javascript
复制
SELECT DISTINCT NAME1, OS1, DEV1, NAME2, OS2, DEV2, P1.fruit FROM Pick AS P1, Pick AS P2, 

(SELECT U1.uID AS User1, U1.name AS NAME1, U1.deviceOS AS OS1, U1.deviceType AS DEV1, 
        U2.uID AS User2, U2.name AS NAME2, U2.deviceOS AS OS2, U2.deviceType AS DEV2
FROM User AS U1, User AS U2 
WHERE (U1.uID != U2.uID) AND
      (U1.deviceType = U2.deviceType) AND
      (U1.deviceOS = "4" OR U1.deviceOS = "4.1") AND
      (U2.deviceOS = "4" OR U2.deviceOS = "4.1")) AS PartialResult

WHERE (P1.uID = PartialResult.User1) AND
      (P2.uID = PartialResult.User2) AND
      (P1.fruit = P2.fruit)

这将返回以下结果,但正如您所看到的,它在某种程度上是“复制的”:

​

​

我试过用水果来解决这个问题,但是它不会在一般情况下返回正确的结果。限制1也不适用于一般情况。因此,经过数小时的努力,我必须问:

在一般情况下有防止这种重复的方法吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-07 21:00:38

而不是U1.uID != U2.uID,而是编写U1.uID > U2.uID。

票数 4
EN

Stack Overflow用户

发布于 2013-02-07 20:58:39

您遇到的问题是,每一行都将被复制,a--b和b--a。您需要某种方式来指定您只需要一个或另一个,但问题是,哪一个?你是否喜欢普里西拉列在马西亚之前,反之亦然?

如果没有首选项,那么您可以简单地组成一些任意性规则,只允许其中一条或另一条。例如,您可以比较名称,并且只能抓取第二个名字之前按字母顺序排列的行(请参见最后一行):

代码语言:javascript
复制
SELECT DISTINCT NAME1, OS1, DEV1, NAME2, OS2, DEV2, P1.fruit FROM Pick AS P1, Pick AS P2, 

(SELECT U1.uID AS User1, U1.name AS NAME1, U1.deviceOS AS OS1, U1.deviceType AS DEV1, 
        U2.uID AS User2, U2.name AS NAME2, U2.deviceOS AS OS2, U2.deviceType AS DEV2
FROM User AS U1, User AS U2 
WHERE (U1.uID != U2.uID) AND
      (U1.deviceType = U2.deviceType) AND
      (U1.deviceOS = "4" OR U1.deviceOS = "4.1") AND
      (U2.deviceOS = "4" OR U2.deviceOS = "4.1")) AS PartialResult

WHERE (P1.uID = PartialResult.User1) AND
      (P2.uID = PartialResult.User2) AND
      (P1.fruit = P2.fruit) AND
      (STRCMP(NAME1, NAME2) < 0)

当然,您可以实现任何您想要的规则,选择一个或另一个。@igelkott的答案通过强制person 1的uID高于person 2的uID来解决这个问题,这是非常合理的(并且比字符串比较更快)。

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

https://stackoverflow.com/questions/14760677

复制
相关文章

相似问题

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