2009-04-13 4 views
0

'위치'(데이터베이스 테이블 위치) 클래스의 ActiveRecord 개체는 'url', 'lat'(위도) 및 'lng' 경도).레일 (또는 SQL) : 중복 AR 개체 찾기 및 삭제

이 모델의 Lat-lng-combination은 고유해야합니다. 문제는 중복 된 lat-lng 조합이있는 데이터베이스에 많은 위치 개체가 있다는 것입니다.

나는 다음과 같은

  1. 이 같은 위도-LNG-조합을 공유하는 객체를 찾기 수행에 도움이 필요합니다.
  2. 객체의 'url'속성이 비어 있지 않으면이 객체를 유지하고 개의 다른 중복을 삭제하십시오. 그렇지 않으면 'created_at'속성을 확인하여 가장 오래된 객체 인 을 선택하고 다른 사본을 삭제하면됩니다.

일회성 작업이므로 SQL (MySQL 5.1 호환) 솔루션도 환영합니다.

답변

5

한 가지 일이 있다면 저는 루비에서 그렇게하고 효율성에 대해 너무 걱정하지 않아도됩니다. 나는이 확실히 가난, 가난이 철저하게 정렬을 확인하고 그러한 그것이 내가 말했듯이 이제 DB :

keep = [] 
locations = Location.find(:all) 

locations.each do |loc| 
    # get all Locations's with the same coords as this one 
    same_coords = locations.select { |l| l.lat == loc.lat and \ 
             l.lng == loc.lng } 
    with_urls = same_coords.select { |l| !l.url.empty? } 

    # decide which list to use depending if there were any urls 
    same_coords = with_urls.any? ? with_urls : same_coords 

    # pick the best one 
    keep << same_coords.sort { |a,b| b.created_at <=> a.created_at }.first.id 
end 

# only keep unique ids 
keep.uniq! 

# now we just delete all the rows we didn't decide to keep 
locations.each do |loc| 
    loc.destroy unless keep.include?(loc.id) 
end 

을에서이 작업을 실행하기 전에 정확하게 당신이 원하는 것을 할 것입니다 있는지 확인하기 위해 테스트하지 않았습니다 암호. 그러나 가끔 해킹하는 것만으로도 '좋은'것을 생각해 낼 때 가치있는 시간을 가질 수 있습니다. 특히 일회용이라면 더욱 그렇습니다.

+0

고마워! 이미 말했듯이, 당신의 솔루션은 그리 우아하지는 않지만 작동합니다. :) – Javier

+0

테스트를 거쳐 정확히 무엇을해야하며 매력처럼 작동하는지 확인합니다. 일회용 솔루션에 이상적입니다. – Javier

+0

멋지다. 섹시함에도 불구하고 효과가 좋다. :) – rfunduk

0

MySQL 열이 2 개인 경우 CONCAT 기능을 사용할 수 있습니다.

SELECT * FROM table1 GROUP BY CONCAT(column_lat, column_lng) 

당신이 또는 전체

SELECT COUNT(*) AS total FROM table1 GROUP BY CONCAT(column_lat, column_lng) 

을 알고 싶다면, 당신은 둘

SELECT COUNT(*) AS total, table1.* FROM table1 
GROUP BY CONCAT(column_lat, column_lng) 

을 결합 할 수 있습니다하지만 당신은 귀하의 질문에 자세한 내용을 설명 할 수 있다면, 아마도 우리는 더 많은 관련을 가질 수있다 답변.

+0

나는 내 질문을 편집했습니다. 이게 내 문제를 분명히 해줍니까? – Javier