我有一张约15列的表格。我希望能够做的是选择一系列ID,并将所有列数据都相同,呈现给我。
在那一刻,我的结构如下:
SELECT id, col_a, col_b ... count(id)
FROM table
GROUP BY col_a, col_b ...
返回组合在一起的行,这些行在所有行中具有相同的数据 - 这是我想要的一半,但理想情况下我希望能够获得具有该值的单行(如果它对于每个行id都相同) )如果存在单一差异,则为NULL。
我不确定它是否可行,但我宁愿看看它是否在SQL查询中是可行的,而不是为PHP编写一些循环逻辑来检查每一行的相似性。
谢谢,
丹
更新:
为了使这个保持最新,我通过编写一个PHP函数来解决这个问题,该函数可以找到重复的函数,然后显示差异。但是我现在已经为每个列创建了一个表,并将列作为对其他表的引用。
E.G。在MainTable中,ColA现在引用表ColA
我目前仍在使用PHP解决问题,主要是因为我认为它仍然存在上述问题,但至少现在我没有存储重复信息。
答案 0 :(得分:0)
通过以下方式与组进行子查询的连接:
SELECT a.id, b.col_a, b.col_b ... b.count)
FROM table a
LEFT JOIN (
SELECT id, col_a, col_b ... count(id) "count"
FROM table GROUP BY col_a, col_b ...
)b on a.id = b.id
这样外部将选择所有行。
如果您仍想分组答案,可以使用UNION
SELECT id, col_a ...
WHERE id NOT IN ("SUBQUERY WITH GROUP BY")
UNION
"SUBQUERY WITH GROUP BY"
不是最好的解决方案,但应该可行
答案 1 :(得分:0)
这是一个毛茸茸的事情,但你可以像David Martensson建议的那样做,我会这样写,但是:
Select a.id, a.col1, a.col2, a.col3
FROM myTable a, myTable b
WHERE a.id != b.id
and a.col1 = b.col1
and a.col2 = b.col2
and a.col3 = b.col3
这将为您提供唯一的ID,但每个结果对于第1,2和3列具有相同的值。但是,我同意您的问题的一些评论者,您应该考虑替代数据结构,因为这可以更好地利用RDBMS模型。在这种情况下,您需要有2个表:
表名:MyTableIds 字段:id,attrId
表名:MyTableAttrs 字段:attrId,attr1,attr2,attr3,ect
通常,如果您有多个记录要复制的数据,则应将其拉入第二个表并创建关系,这样您只需将重复数据存储一次,然后多次引用它
答案 2 :(得分:0)
从理解你的问题看来,这似乎是可行的。
这是一种可能的模式:
SELECT
/* GROUP BY columns */
col_A,
col_B,
...
/* aggregated columns */
CASE MIN(col_M) WHEN MAX(col_M) THEN MIN(col_M) ELSE NULL END,
CASE MIN(col_N) WHEN MAX(col_N) THEN MIN(col_N) ELSE NULL END,
...
COUNT(...),
SUM(...),
WHATEVER(...),
...
FROM ...
GROUP BY col_A, col_B, ...