1

我有一个 select 语句,至少应该只返回唯一的 userId。如果这没有发生并且 userIds 是双倍的,则用户确实输入了非法内容。

为了说明,我们使用一个简单的SELECT userId, name, FROM USER. 现在,通常您将在表级别设置 userId 唯一/主键。只是为了我们没有的例子。

预期的结果是:

userId    name
---------------
1         Roel
2         Joe
3         John

但结果是这样的

userId    name
---------------
1         Roel
1         Roel
2         Joe
3         John
3         John

是否有可能以这样一种方式进行查询,当结果包含多个 userId 时会出错?

4

4 回答 4

1

只需添加DISTINCT. 它会让你的行独一无二。

SELECT DISTINCT userId, name 
FROM USER

根据定义,DISTINCT关键字可用于仅返回不同(不同)的值。

更新 1

原因是您没有在表上指定约束。像这样进行表定义。

CREATE TABLE userList
(
    ID INT NOT NULL AUTO_INCREMENT,
    NAME VARCHAR(50) NOT NULL,
    CONSTRAINT id_PK PRIMARY (ID),
    CONSTRAINT name_unique UNIQUE (NAME)
)

当你不想ID被auto_incremented时,你可以去掉AUTO_INCREMENT表定义上的单词,或者像这样创建一个表定义

CREATE TABLE userList
(
    ID INT NOT NULL,
    NAME VARCHAR(50) NOT NULL,
    CONSTRAINT id_PK PRIMARY (ID),
    CONSTRAINT name_unique UNIQUE (ID, NAME)
)
于 2012-09-05T09:04:13.913 回答
1
SELECT 
    UserId, COUNT(*)
FROM 
    User
GROUP BY
    UserId
HAVING 
   COUNT(*) > 1

从这里返回的任何记录都将是那些有错误数据的记录。这将是确定何时引发错误的最简单方法,但它不会简单地为您引发错误。您可以将上述查询包装到一个过程中,并使用一些逻辑来确定是引发错误还是运行主查询。

于 2012-09-05T08:59:22.230 回答
0

好吧,我想这在注册期间很重要......所以在允许插入之前只需 count() 给定用户名的点击次数。

其次,使名称列唯一,然后在 INSERT 时得到正确的错误

于 2012-09-05T09:08:56.553 回答
0

另一种解决方案是

SELECT *
FROM User
UNION
SELECT *
FROM User

这样做的好处是您不必在 SELECT 中列出变量。通常,不明确地写列名是不好的,但我认为这种情况是有意义的罕见情况之一。

于 2015-01-19T17:26:43.023 回答