我有3张这样的表:
TABLE_1
+-ID-+-table_3_id-+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
+----+------------+
TABLE_2
+-ID-+-table_1_id-+-name--+-value-+
| 1 | 1 | Name1 | Data1 |
| 2 | 1 | Name2 | Data2 |
| 3 | 1 | Name3 | Data3 |
| 4 | 2 | Name1 | Data1 |
| 5 | 2 | Name2 | Data4 |
| 6 | 2 | Name3 | Data5 |
| 7 | 3 | Name1 | Data6 |
| 8 | 3 | Name2 | Data2 |
+----+------------+-------+-------+
表3由ID和其他与此问题无关的数据组成。但是,我需要能够过滤table_3_id
。
这就是我需要的: 表2有多行,其中包含table_1中行的信息。我需要有一个查询来检查'data'列中是否有重复项,它们具有相同的'name'。我需要的结果是(使用WHERE table_3_id = 1):
+-table_3_id-+-name--+-value-+-duplicate-+
| 1 | Name1 | Data1 | true |
| 1 | Name2 | Data2 | false |
| 1 | Name3 | Data3 | false |
+------------+-------+-------+-----------+
或者,如果可能,只返回table_2中实际上是重复的数据。 'duplicate'字段也可以是一个计数,因为我知道具有相同table_3_id的行数。
我希望我的问题足够明确。如果不够清楚,我会尝试改进它。我已尝试使用连接和子查询,但我对SQL的了解还不足以进行这样的高级查询。我更喜欢在单个查询中使用它而不是PHP中的多个。
答案 0 :(得分:2)
您可以使用下面的内容:
select Name
from table
group by name
having count(*) > 1
答案 1 :(得分:1)
如果存在重复项,则需要检查Table_2中的每一行。这可以使用子查询来完成,如下所示:
SELECT
B.Table_3_ID
,A.Name
,A.Value
,(SELECT COUNT(*) FROM Table_2 C
WHERE C.Name = A.Name AND C.Value = A.Value)
AS DuplicateCount
FROM Table_2 A
INNER JOIN Table_1 B
ON A.Table_1.ID = B.ID
我的SQL中可能存在一些错误,尤其是表别名,因为我目前没有语法检查,但原则应该有效。