【问题标题】:UNION not removing duplicatesUNION 不删除重复项
【发布时间】:2020-07-21 06:09:20
【问题描述】:

我正在尝试查询 2 个表,在合并重复项时返回值。虽然 UNION 应该删除重复项,但在这种情况下似乎失败了。请注意,此查询是使用 PHP 发送的。

查询

<?php

$keywords = 'MOTOR';

$toSend = "SELECT part as Column1, '' as Column2 FROM soldParts WHERE part LIKE '%".$keywords."%' UNION SELECT part as Column1, vin as Column2 FROM vinData WHERE part LIKE '%".$keywords."%' ORDER BY column1 ASC";

?>


电流输出

Column1 Column2

电机 1

电机 2

电机 2 CCDD44

电机 3 AABB1122

电机 3


期望的输出

Column1 Column2

电机 1

电机 2 CCDD44

电机 3 AABB1122


我查了几个类似的问题。但是,我的第二列应该只是合并(或连接),不像其他问题和/或它们不涉及多个表。另请注意,表 soldParts Column2 没有任何价值。

【问题讨论】:

  • 电机 2 和电机 2 CCDD44 不是同一行...
  • 您确定 UNION 是正确的选择吗?这更像是你在左外连接之后——SELECT a.part, b.vin FROM soldparts AS a LEFT OUTER JOIN vinData AS b ON a.part = b.part?语义有点可疑。一个给定的零件通常可以为多辆汽车出售,但您的数据并未显示这一点,同样的评论也适用于您的 UNION 配方。

标签: mysql sql select duplicates union


【解决方案1】:

您的结果集实际上没有重复项。重复是所有列具有相同值的行,并且结果集中没有任何行符合该定义。

大概,您希望在外部查询中进行聚合:

select column1, max(column2) column2
from (
    select part as column1, null as column2 from soldparts where part like ?
    union all
    select part as column1, vin as column2 from vindata where part like ?
)
group by column1
order by column1 asc

请注意,我修改了您的查询以使用绑定参数 (?);为了安全和高效,应该学会使用参数化查询,而不是在查询字符串中串联变量。

【讨论】:

    【解决方案2】:

    要获得您想要的结果,您需要在UNION 之上(但在ORDER BY 之前)执行聚合。

    例如:

    select Column1, max(Column2) as Column2
    from (
      SELECT part as Column1, '' as Column2 
      FROM soldParts 
      WHERE part LIKE ?
      UNION 
      SELECT part, vin
      FROM vinData 
      WHERE part LIKE ?
    ) x
    GROUP BY Column1
    ORDER BY Column1
    

    【讨论】:

    • 这也可以,但需要GROUP BY Column1 才能使其运行
    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2021-05-25
    • 2016-08-13
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多