Mysql DISTINCT不会删除重复项

Mysql DISTINCT不会删除重复项,mysql,sql,Mysql,Sql,由于某些原因,无法使用选择DISTINCT删除重复项 我的桌子: mysql> select * from kasutaja; +----+---------+----------+---------------+ | id | eesnimi | perenimi | kasutaja_nimi | +----+---------+----------+---------------+ | 1 | Juku | Juust | juku23 | | 2 |

由于某些原因,无法使用
选择DISTINCT
删除重复项

我的桌子:

mysql> select * from kasutaja;
+----+---------+----------+---------------+
| id | eesnimi | perenimi | kasutaja_nimi |
+----+---------+----------+---------------+
|  1 | Juku    | Juust    | juku23        |
|  2 | Jaan    | Jaanik   | jann12        |
+----+---------+----------+---------------+

mysql> select * from riistvara;
+----+----------------+-----------+
| id | r_nimetus      | seeria_nr |
+----+----------------+-----------+
|  1 | Latitude L2100 |  33333333 |
|  2 | Latitude L2110 |  44444444 |
+----+----------------+-----------+

mysql> select * from r_paigaldus;
+-------------+--------------+----------------+
| kasutaja_id | riistvara_id | paigalduse_aeg |
+-------------+--------------+----------------+
|           1 |            1 | 2010-01-01     |
|           1 |            2 | 2010-10-01     |
|           2 |            2 | 2010-01-01     |
|           2 |            1 | 2010-10-10     |
+-------------+--------------+----------------+
我正在使用的查询:

SELECT DISTINCT kasutaja_nimi, eesnimi, perenimi, r_nimetus, seeria_nr, paigalduse_aeg 
FROM riistvara, kasutaja 
JOIN r_paigaldus ON id = r_paigaldus.kasutaja_id;
查询结果的最终外观如下:

+---------------+---------+----------+----------------+-----------+--------------+
| kasutaja_nimi | eesnimi | perenimi | r_nimetus      | seeria_nr |paigalduse_aeg|
+---------------+---------+----------+----------------+-----------+--------------+
| jann12        | Jaan    | Jaanik   | Latitude L2100 |  33333333 |2010-10-10    |
| juku23        | Juku    | Juust    | Latitude L2110 |  44444444 |2010-10-01    |
+---------------+---------+----------+----------------+-----------+--------------+
它看起来是什么样子:

+---------------+---------+----------+----------------+-----------+----------------+
| kasutaja_nimi | eesnimi | perenimi | r_nimetus      | seeria_nr | paigalduse_aeg |
+---------------+---------+----------+----------------+-----------+----------------+
| juku23        | Juku    | Juust    | Latitude L2100 |  33333333 | 2010-01-01     |
| juku23        | Juku    | Juust    | Latitude L2110 |  44444444 | 2010-01-01     |
| juku23        | Juku    | Juust    | Latitude L2100 |  33333333 | 2010-10-01     |
| juku23        | Juku    | Juust    | Latitude L2110 |  44444444 | 2010-10-01     |
| jann12        | Jaan    | Jaanik   | Latitude L2100 |  33333333 | 2010-01-01     |
| jann12        | Jaan    | Jaanik   | Latitude L2110 |  44444444 | 2010-01-01     |
| jann12        | Jaan    | Jaanik   | Latitude L2100 |  33333333 | 2010-10-10     |
| jann12        | Jaan    | Jaanik   | Latitude L2110 |  44444444 | 2010-10-10     |
+---------------+---------+----------+----------------+-----------+----------------+

首先,这个查询很有效,因为
seeria\u nr
paigalduse\u aeg
与您看到的不同,所以
DISTINCT
无法过滤掉它们

您可以使用
分组方式
获得所需内容:

GROUP BY
    b.kasutaja_nimi
    ,b.eesnimi
    ,b.perenimi
    ,a.r_nimetus

这将为您带来您执行的结果-但请记住,
seeria\u nr
paigalduse\u aeg
将随机显示值。

首先,此查询工作正常,因为
seeria\u nr
paigalduse\u aeg
是不同的,正如您所看到的,
DISTINCT
无法过滤掉他们

您可以使用
分组方式
获得所需内容:

GROUP BY
    b.kasutaja_nimi
    ,b.eesnimi
    ,b.perenimi
    ,a.r_nimetus

这将为您带来您执行的结果-但请记住,
seeria\u nr
paigalduse\u aeg
将随机显示值。

正确使用
join
。简单规则:切勿在
FROM
子句中使用逗号。始终使用显式
JOIN
语法

SELECT kasutaja_nimi, eesnimi, perenimi, r_nimetus, seeria_nr, paigalduse_aeg 
FROM kasutaja k JOIN
     r_paigaldu rp 
     ON k.id = rp.kasutaja_id JOIN
     riistvarar r
     ON r.id = rp.riistvara_id;

这可能会消除对
选择distinct
的需要。此外,您应该使用表别名并限定所有列名。

正确使用
join
。简单规则:切勿在
FROM
子句中使用逗号。始终使用显式
JOIN
语法

SELECT kasutaja_nimi, eesnimi, perenimi, r_nimetus, seeria_nr, paigalduse_aeg 
FROM kasutaja k JOIN
     r_paigaldu rp 
     ON k.id = rp.kasutaja_id JOIN
     riistvarar r
     ON r.id = rp.riistvara_id;

这可能会消除对
选择distinct
的需要。此外,您应该使用表别名并限定所有列名。

您是在谈论mysql还是sql server?在任何一种情况下,
distinct
都可能按设计工作,您的假设并不正确。这些结果是正确的,您在查看
r\u nimetus
seeria\u nr
paigalduse\u aeg
时有不同的值组合
纬度L2100
纬度L2110
33333333
444444
2010-01-01
2010-10-01
相结合。您在找这个吗?最终结果集是否包含每个日期的条目?请解释你的预期产出。顺便说一句,DISTINCT适用于整行,而不是它前面的列。除非您在另一个表中有一些我们不知道的其他条件,否则您的预期结果没有多大意义。对于
jann12
您有
纬度L2100
(分组中的较低值)、
33333333
(分组的较低值)和
2010-10-10
(分组的较高值)。对于
joku23
您有
Latitude 2110
(分组中的上限值)、
4444
(分组中的上限值)和
2010-10-01
(分组中的上限值)。您是在谈论mysql还是sql server?在任何一种情况下,
distinct
都可能按设计工作,您的假设并不正确。这些结果是正确的,您在查看
r\u nimetus
seeria\u nr
paigalduse\u aeg
时有不同的值组合
纬度L2100
纬度L2110
33333333
444444
2010-01-01
2010-10-01
相结合。您在找这个吗?最终结果集是否包含每个日期的条目?请解释你的预期产出。顺便说一句,DISTINCT适用于整行,而不是它前面的列。除非您在另一个表中有一些我们不知道的其他条件,否则您的预期结果没有多大意义。对于
jann12
您有
纬度L2100
(分组中的较低值)、
33333333
(分组的较低值)和
2010-10-10
(分组的较高值)。对于
joku23
,您有
纬度2110
(分组中的上限值)、
4444
(分组中的上限值)和
2010-10-01
(分组中的上限值)。