我正在使用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在用户中的外键。
我正在执行以下查询:
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也不适用于一般情况。因此,经过数小时的努力,我必须问:
在一般情况下有防止这种重复的方法吗?
谢谢!
发布于 2013-02-07 21:00:38
而不是U1.uID != U2.uID,而是编写U1.uID > U2.uID。
发布于 2013-02-07 20:58:39
您遇到的问题是,每一行都将被复制,a--b和b--a。您需要某种方式来指定您只需要一个或另一个,但问题是,哪一个?你是否喜欢普里西拉列在马西亚之前,反之亦然?
如果没有首选项,那么您可以简单地组成一些任意性规则,只允许其中一条或另一条。例如,您可以比较名称,并且只能抓取第二个名字之前按字母顺序排列的行(请参见最后一行):
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来解决这个问题,这是非常合理的(并且比字符串比较更快)。
https://stackoverflow.com/questions/14760677
复制相似问题