从mysql查询中排除'near'重复项

时间:2013-02-06 16:22:48

标签: mysql sql database

我们有一个iPhone应用程序,每天都会多次向我们的员工发送发票数据。当它们处于低单元信号区域时,票证可以作为重复进入,但是它们在mysql数据库中被分配了唯一的“作业ID”,因此它们被视为唯一的。我可以排除作业ID并创建剩余的列DISTINCT,它为我提供了我正在寻找的过滤行(因为字面上每个数据点除了作业ID之外都是相同的),但是我需要作业ID,因为它是每张发票的主要参考点,是我指出的:批准,编辑等。

所以我的问题是,如何在我的查询中过滤掉“附近”的重复行,同时仍然为每张票提取作业ID?

当前查询如下:

SELECT * FROM jobs, users
WHERE jobs.job_csuper = users.user_id
AND users.user_email = '".$login."'
AND jobs.job_approverid1 = '0'

感谢您对此进行调查!

编辑(提供的示例): 这就是我所说的'近似重复'

Job_ID - Job_title - Job_user - Job_time - Job_date
2345 - Worked on circuits - John Smith - 1.50 - 2013-01-01
2344 - Worked on circuits - John Smith - 1.50 - 2013-01-01
2343 - Worked on circuits - John Smith - 1.50 - 2013-01-01

所以除了Job_ID列之外,一切都是相同的。

3 个答案:

答案 0 :(得分:1)

您需要group by

SELECT *
FROM jobs, users
WHERE jobs.job_csuper = users.user_id
AND users.user_email = '".$login."'
AND jobs.job_approverid1 = '0'
group by <all fields from jobs except jobid>

我认为最终的查询应该是这样的:

select min(Job_ID) as JobId, Job_title, user.name as Job_user, Job_time, Job_date
FROM jobs join users
     on jobs.job_csuper = users.user_id
WHERE jusers.user_email = '".$login."' AND jobs.job_approverid1 = '0'
group by Job_title, user.name, Job_time, Job_date

(这使用ANSI语法进行连接,并明确说明要返回的字段。)

答案 1 :(得分:1)

  1. 最好防止双重提交。
  2. 鉴于你无法阻止双重提交......
  3. 我会这样查询:

    select
       min(Job_ID)          as real_job_id
      ,count(Job_ID)        as num_dup_job_ids
      ,group_concat(Job_ID) as all_dup_job_ids
      ,j.Job_title, j.Job_user, j.Job_time, j.Job_date
    from
      jobs j
      inner join users u on u.user_id = j.job_csuper
    where
      whatever_else
    group by
      j.Job_title, j.Job_user, j.Job_time, j.Job_date
    

    这包括超出您明确要求的内容。但是,提醒您有多少重复可能会很好,并且可以在您需要时轻松访问重复的ID信息。

答案 2 :(得分:0)

如何为每一行创建哈希并比较它们:

`SHA1(concat_ws(field1, field2, field3, ...)) AS jobhash`