[英]Removing duplicates from SQL query
我正在尝试创建一个SQL查询,该查询将不返回具有相同ID的行。 我还想指定一个主行,以便在两行具有相同ID的情况下,将返回主行。 如果未指定主行,我想返回第一行。
这是我要查询的数据库示例。
+----+---------+-------+
| id | primary | label |
+----+---------+-------+
| 1 | Y | A |
| 1 | | B |
| 2 | | C |
| 2 | | D |
| 3 | | E |
+----+---------+-------+
这是我要达到的结果的一个示例
+----+---------+-------+
| id | primary | label |
+----+---------+-------+
| 1 | Y | A |
| 2 | | C |
| 3 | | E |
+----+---------+-------+
我一直在尝试使用select different,但是对于解决此问题的方向我不确定。 任何帮助是极大的赞赏。 谢谢!
在您的情况下,子查询比DISTINCT更合适。
请尝试以下。 这是获得所需结果的演示: http : //sqlfiddle.com/#!2/97fdd3/1/0
顺便说一下,当ID没有“主要”时,这将为该ID选择最低的标签值。 正如其他人所说,这比“数据库中的顺序”更可靠。
select *
from tbl t
where t.label = (select x.label
from tbl x
where x.primary = 'Y'
and x.id = t.id)
or (not exists
(select 1
from tbl x
where x.primary = 'Y'
and x.id = t.id) and
t.label = (select min(x.label) from tbl x where x.id = t.id))
我可以看到您已经有了答案,但是您也可以使用常规的LEFT JOIN
;
SELECT * FROM mytable a
LEFT JOIN mytable b
ON a.id = b.id AND (
a.label>b.label AND a.primary IS NULL AND b.primary IS NULL OR
a.primary IS NULL AND b.primary='Y')
WHERE b.id IS NULL
SELECT a.id,
IFNULL(primaries.primary, '') AS primary,
IFNULL(primaries.label, secondary.label) AS label
FROM yourTable AS a
LEFT JOIN (SELECT *
FROM yourTable
WHERE primary = 'Y') AS primaries
ON a.id = primaries.id AND a.label = primaries.label
LEFT JOIN (SELECT id, MIN(label) AS label
FROM yourTable
WHERE primary != 'Y'
GROUP BY id) AS secondary
ON a.id = secondary.id AND a.label = secondary.label
也许像这样的作品(未经测试):
SELECT DISTINCT
t1.id
,t2.primary
,t2.label
FROM table t1
LEFT JOIN (
SELECT id, primary, label
FROM table
GROUP BY id
ORDER BY primary DESC, label ASC
LIMIT 1
) t2 ON t2.id=t1.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.