检索MySQL中具有相同列字段的行的ID

时间:2012-01-04 21:32:16

标签: mysql sql group-by

我有一个有趣的情况 - 我的系统有多个属性,其中一些共享相同的地址。因此,如果number列和street列的值匹配(我将使用LOWER()作为字符串列的处理器),我想要这些行的ID。我还需要排除没有匹配的行。

问题是,据我所知,如果我使用GROUP BY命令,它将不会检索符合条件的每个家庭行的ID。我的替代方案是什么?我当然可以编写一个PHP脚本,将所有地址组合存储在一个数组中,然后选出重复项来重新组合ID,但我希望有一种更简单的方法。

到目前为止我的MySQL查询是

SELECT COUNT(*) as cnt, id FROM homes GROUP BY number, street WHERE cnt>1

但它不起作用......我不确定我是否正确使用cnt> 1部分。

编辑:

以下是我的表格的样子(desc homes结果)

SQL query: desc homes; 
Rows: 72
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
masterid int(11) NO NULL
source int(11) NO MUL 0
firm_1 varchar(255) NO NULL
firm_2 varchar(255) NO NULL
firm_1_id varchar(255) NO MUL NULL
firm_2_id varchar(255) NO NULL
firm_phone_1 varchar(255) NO NULL
firm_phone_2 varchar(255) NO NULL
firm_fax_1 varchar(255) NO NULL
firm_fax_2 varchar(255) NO NULL
realtor_1 varchar(255) NO NULL
realtor_2 varchar(255) NO NULL
realtor_phone_1 varchar(255) NO NULL
realtor_phone_2 varchar(255) NO NULL
create_date datetime NO NULL
modify_date datetime NO NULL
lat varchar(255) NO MUL
long varchar(255) NO MUL
sold varchar(255) NO MUL
feature int(1) NO MUL 0
mls varchar(10) NO MUL
ord decimal(7,2) NO 0.00
type varchar(255) NO MUL 0
building varchar(255) NO
price varchar(255) NO
prevprice varchar(255) NO
showaddress enum('0','1') NO 1
unit varchar(255) NO
number varchar(255) NO
street varchar(255) NO
area varchar(255) NO MUL
city varchar(255) NO MUL
openhouse varchar(255) NO
videolink varchar(255) NO
youtube varchar(255) YES NULL
youtube1 varchar(255) YES NULL
remarks int(11) NO 0
bedroom varchar(255) NO
bathroom varchar(255) NO
sqftup varchar(255) NO
sqftmain varchar(255) NO
sqftdown varchar(255) NO
fullbath varchar(255) NO
halfbath varchar(255) NO
kitchen varchar(255) NO
fireplace varchar(255) NO
parking varchar(255) NO
storage varchar(255) NO
style varchar(255) NO NULL
tax varchar(255) NO
maintenance varchar(255) NO NULL
warranty varchar(255) NO NULL
sqft varchar(255) NO
lot varchar(255) NO
depth varchar(255) NO NULL
rearexposure varchar(255) NO NULL
basement varchar(255) NO NULL
suite varchar(255) NO NULL
view varchar(255) NO NULL
balcony varchar(255) NO NULL
rental varchar(255) NO NULL
construction varchar(255) NO NULL
frontage varchar(255) NO
story varchar(255) NO
year varchar(255) NO
description text NO NULL
description2 text NO NULL
dimension text NO NULL
heading varchar(255) NO
publish enum('0','1') NO MUL 0
views int(11) NO 0

2 个答案:

答案 0 :(得分:4)

您可以使用mysql group_concat功能agGregation保留ID:

SELECT 
  COUNT(*) as cnt, 
  group_concat( cast(Id as char) ) as ids 
FROM 
  homes 
GROUP BY 
  number, street 
HAVING
  COUNT(*) > 1

答案 1 :(得分:0)

我不是100%确定你想要什么,但听起来你的数据库中有重复的房子,如果'number'和'street'匹配另一行,你可以判断它是否重复。

如果是这样,我会这样做:

select id, unit, number, street 
from homes as h1
where number + '//' + street in 
    (select number + '//' + street from homes as h2 where h2.id <> h1.id and h1.city = h2.city)

内部select语句将所有行(当前行除外)返回为“number // street”。这样,如果当前行的“number // street”与内部select语句中的值匹配,则它是重复的。我不确定idmasterid是否是您最后的主要ID值。 '//'是一个唯一的字符串,因此您不会将查询视为这两行:

id       number         street
1        23             example
2        2              3example

与将“23 // example”与“2 // example”进行比较而不是使用“23example”相同。