3

我们有一个 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 列之外,一切都是相同的。

4

3 回答 3

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 语法进行连接,并且对返回的字段是明确的。)

于 2013-02-06T16:35:20.937 回答
1
  1. 最好防止重复提交。
  2. 鉴于您无法阻止重复提交...

我会这样查询:

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

这包括比您明确要求的更多。但是,提醒您有多少 dup 可能会很好,并且它可以让您在需要时轻松访问重复的 id 信息。

于 2013-02-06T16:52:43.690 回答
0

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

`SHA1(concat_ws(field1, field2, field3, ...)) AS jobhash`
于 2013-02-06T16:30:00.623 回答