mysql选择distinct而忽略一列

时间:2016-04-15 14:19:59

标签: php mysql

我遇到以下问题:我有一张表import_data

这个表格很丰富

|  id  |  profile_id  |  sku  |  vendor  | price |  importRun  |
|  1   |     39       |  123  |  myVen   |  2.0  |      1      |
|  2   |     39       |  456  |  myVen   |  2.0  |      1      |
|  3   |     39       |  123  |  myVen   |  3.0  |      2      | 

我需要获得的是所有元素的输出,但只有一次。每个sku必须是独一无二的。更糟糕的是,如果它们是多余的,我需要最新的数据。

我的输出应该是这样的:

|  id  |  profile_id  |  sku  |  vendor  | price |  importRun  |
|  2   |     39       |  456  |  myVen   |  2.0  |      1      |
|  3   |     39       |  123  |  myVen   |  3.0  |      2      | 

关于结构的简短摘要

ID = PK
sku =文章的唯一标识符
importRun =需要进行比较。

所以,解释一下:我有一个import-script,它读取给定的CSV文件并导入其中列出的所有文章。我定期(每周一次)获得此CSV文件。我需要收集所有数据并保存,以便稍后创建价格演变。

每次导入后,我都会增加 importRun 的数量,这样就不会丢失任何信息(请记住,我无法使用REPLACE INTOINSERT IGNORE

现在,当我导出它时,如果SKU多次出现,我需要最新的数据。在这种情况下,SKU 123在两次不同的运行中插入2次。这意味着,由于我最新的Run有2号,我需要这个tupel(并忽略第一个)。

当我使用DISINCT时,它仍然会输出相同的表,因为它们根本不相同,因为importRun不同。

我应该可以使用GROUP BY,但我无法确定将采用哪个值,第一个还是最后一个? (importRun 1或2)

更新1

接下来是@mitkosoft的想法,我尝试了以下内容:

SELECT DISTINCT t1.*
FROM import_data t1
INNER JOIN import_profiles imp on t1.profile_id = imp.id
INNER JOIN (
    SELECT DISTINCT sku, MAX(importRun) AS importRun
    FROM import_data
    GROUP BY sku ) t2
ON t1.sku = t2.sku
WHERE imp.creditornr = 73329
AND t1.vendor = 'rackmountit'
AND t1.importRun = t2.importRun

**更新2 ** 我为所有相关的表添加了完整的结构。

导入-数据:的     | enter image description here

导入-配置文件的     enter image description here 但我仍然得到重复:/

2 个答案:

答案 0 :(得分:1)

您需要做的就是为每个MAX(importRun)确定sku

SELECT
    t1.*
FROM
    import_data t1
    INNER JOIN (
        SELECT sku, MAX(importRun) AS importRun FROM import_data GROUP BY sku
    ) t2 
    ON t1.sku = t2.sku 
    AND t1.importRun = t2.importRun

输出是:

+----+------------+-----+--------+-------+-----------+
| id | profile_id | sku | vendor | price | importRun |
+----+------------+-----+--------+-------+-----------+
|  2 |         39 | 456 | myVen  | 2.0   |         1 |
|  3 |         39 | 123 | myVen  | 3.0   |         2 |
+----+------------+-----+--------+-------+-----------+
2 rows in set

答案 1 :(得分:0)

也许你可以加入sku = sku

的同一张桌子