在MySQL中创建一个唯一的select语句

时间:2012-09-05 08:56:16

标签: mysql sql

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

为了说明我们使用简单的SELECT userId, name, FROM USER。现在,通常您将在表级别创建userId unique / primarykey。仅仅为了这个例子,我们没有。

预期结果将是:

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

但结果类似于

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

是否有可能以这样的方式进行查询:当结果包含多个userIds时,它会产生错误?

4 个答案:

答案 0 :(得分:1)

SELECT 
    UserId, COUNT(*)
FROM 
    User
GROUP BY
    UserId
HAVING 
   COUNT(*) > 1

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

答案 1 :(得分: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_INCREMENT字,或者创建一个像这样的表定义

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

答案 2 :(得分:0)

好吧,我想这在注册过程中是重要的...所以在允许INSERT之前只计算给定用户名的命中数。

其次使名称列为UNIQUE,然后在INSERT

时得到正确的错误

答案 3 :(得分:0)

另一种解决方案是

SELECT *
FROM User
UNION
SELECT *
FROM User

这样做的好处是您不必在SELECT中列出变量。通常,不明确写明列名是不好的,但我认为这种情况是极少数情况下有意义的。