我在MySQL中有一个表格如下:
https://www.google.com/maps/embed/v1/place?key=YOUR_API_KEY
&q=place_id:YOUR_PLACE_ID
col1和col2之间的关系与位置无关,即col1中的OBJ1和col2中的OBJ2与col2中的OBJ1和col1中的OBJ2相同。这意味着OBJ1和OBJ2共享一种关系。 现在,这意味着对象OBJ1和OBJ2的值为1,5,3 ...... 我想只保留不同的值,即OBJ1,OBJ2应该只在表中出现一次,甚至不是OBJ2,OBJ1。 重要的是,我想只保留具有最高值的行。 我想要的结果是:
ID, COL1, COL2 VALUE
'1', 'OBJ1', 'OBJ2', '5'
'2', 'OBJ1', 'OBJ2', '1'
'3', 'OBJ2', 'OBJ1', '3'
'4', 'OBJ3', 'OBJ1', '4'
'5', 'OBJ3', 'OBJ4', '6'
这样做的最佳和有效方法是什么?我有超过1000万行。
我在很多论坛/谷歌搜索过但找不到我要找的确切答案..
答案 0 :(得分:0)
试试这个:
{{1}}
答案 1 :(得分:0)
您可以使用in子句和按
分组的子选择用于解决与不同对组合相关的问题 您应该以适当的方式组织数据
select
id
, case when col1 <= col2 then col1 else col2 end COL1
, case when col1 > col2 then col1 else col2 end COL2
, value
from start_table
然后查询变为
SELECT t1.ID, t1.COL1, t1.COL2, t1.VALUE
FROM (
select
id
, case when col1 <= col2 then col1 else col2 end COL1
, case when col1 > col2 then col1 else col2 end COL2
, value
from start_table
) t1
where value in (
select max(value)
FROM (
select
id
, case when col1 <= col2 then col1 else col2 end COL1
, case when col1 > col2 then col1 else col2 end COL2
, value
from start_table
) mytable
group by col1, col2
)
或使用内部联接
SELECT t1.ID, t1.COL1, t1.COL2, t1.VALUE
FROM (
select
id
, case when col1 <= col2 then col1 else col2 end COL1
, case when col1 > col2 then col1 else col2 end COL2
, value
from start_table
) t1
inner join
(
select max(value) as value
FROM (
select
id
, case when col1 <= col2 then col1 else col2 end COL1
, case when col1 > col2 then col1 else col2 end COL2
, value
from start_table
) mytable
group by col1, col2
) T2 on t1.value = t2.value
答案 2 :(得分:0)
重建表格,以便不允许重复;在这个过程中,摆脱重复。 (并摆脱显然无用的id
。)
CREATE TABLE new (
col1 ...,
col2 ...,
`value` ...,
PRIMARY KEY(col1, col2),
INDEX(col2, col2, `value`)
) ENGINE=InnoDB;
INSERT INTO new (col1, col2, `value`)
SELECT LEAST(col1, col2),
GREATEST(col1, col2),
`value`
ON DUPLICATE KEY UPDATE
`value` := GREATEST(`value`, VALUES(`value`));
RENAME TABLE real TO old,
new TO real;
DROP TABLE old;
将来,您需要INSERTing
/ UPDATEing
个新行:
INSERT INTO new (col1, col2, `value`)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
`value` := GREATEST(`value`, VALUES(`value`));
(假设您希望在表格中已经增加value
。)
这些节省空间和速度(对于10M行很重要):摆脱id
;具有最佳指标;使用InnoDB;等