如何在PostgreSQL中使用select distinct时忽略某一列?

6

大家好!

我有一个 SQL(如上所示),我想知道如何确保在名称相同的情况下不重复。如果一个名称出现在第一个选择中,它是主要的,并且应该在后续选择中被忽略。

"SELECT name, id, 'place' AS tablename FROM places WHERE lower(name) LIKE '".strtolower($needle)."%'"
    ."UNION SELECT name, id, 'community' AS tablename FROM communities WHERE lower(name) LIKE '".strtolower($needle)."%'"
    ."UNION SELECT name, id, 'district' AS tablename FROM districts WHERE lower(name) LIKE '".strtolower($needle)."%'"
    ."UNION SELECT name, id, 'region' AS tablename FROM regions WHERE lower(name) LIKE '".strtolower($needle)."%'"
    ."UNION SELECT name, id, 'province' AS tablename FROM provinces WHERE lower(name) LIKE '".strtolower($needle)."%'"
    ."ORDER BY name LIMIT 10"

这是我的SQL语句。

您需要更多的信息吗?

谢谢。


这只是为了测试如何运作,安全性接下来考虑;-) - helle
1
你可以告诉我注入点在哪里吗?我现在正在进行安全性检查;-) - helle
1个回答

5

DISTINCT

SELECT DISTINCT ON (name) name, id, tablename 
FROM (
    SELECT name, id, 'place' AS ... 
    UNION ... 
    UNION ... 
    UNION ... 
    UNION ...) AS subQuery
ORDER BY name LIMIT 10

只需在查询中使用子查询指定仅对name进行去重。

在去重时进行限制和排序,否则去重可能会丢弃重复项并不按正确的排序顺序给出完整的10行。


如果我将它添加到每个选择中,不同的表会被选择为distinct,但在union中我会有重复。 - helle
谢谢...但根本不起作用 :-( 我必须为子查询使用别名...选择不同的...从(...)作为子查询名称的订单...现在它可以工作了。 - helle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接