【问题标题】:Invalid token in SQL query with UNION statement使用 UNION 语句的 SQL 查询中的令牌无效
【发布时间】:2018-06-14 15:33:57
【问题描述】:

我试图通过将电子邮件地址放在 3 个不同的表(oc_customer、oc_journal2_newsletter 和 oc_d_newsletter_subscriber)中来执行 MySQL 查询。当所有电子邮件都放入 1 列时,我想对其进行分组以避免重复并将数据升序排序。

我在下面有以下查询,但每次在有效执行查询之前收到有关无效令牌“)”的消息。该消息指向具有代码的行 .... subscribed = '1')....

有人可以帮我避免这个警告吗?

SELECT `emailTOTAAL`.`emailTOT`
FROM (
SELECT 
  `oc_customer`.`email` AS `emailTOT`
FROM
  `oc_customer`
WHERE
  `oc_customer`.`language_id` = '2' AND 
  `oc_customer`.`newsletter` = '1'
UNION ALL
SELECT 
  `oc_journal2_newsletter`.`email` AS `emailTOT`
FROM
  `oc_journal2_newsletter`
UNION ALL
SELECT 
  `oc_d_newsletter_subscriber`.`email` AS `emailTOT`
FROM
  `oc_d_newsletter_subscriber`
WHERE
  `oc_d_newsletter_subscriber`.`language_id` = '2' AND 
  `oc_d_newsletter_subscriber`.`subscribed` = '1') 
AS `emailTOTAAL`
GROUP BY   
 `emailTOTAAL`.`emailTOT`
ORDER BY
 `emailTOTAAL`.`emailTOT` ASC

谢谢, 副手

【问题讨论】:

  • 订阅的数据类型是什么?
  • 订阅的数据类型是int(1)
  • 因为这是MySQL 语法,所以我删除了SQL-Server tag。如果您有理由同时标记两个 RDBM,则可​​以还原。
  • 顺便说一句,注意 int(1) 中的 1 几乎没有意义
  • 当您只执行联合而不是子选择时会发生什么?为什么不只使用 UNION 而不是 UNION ALL 来删除重复项?

标签: mysql sql


【解决方案1】:

如果您将UNION ALL 更改为UNION,它应该会为您删除重复项。然后你可以摆脱外部的SELECTGROUP BY。您的查询将如下所示:

SELECT 
    `email` AS `emailTOT`
FROM
    `oc_customer`
WHERE
    `language_id` = '2' AND 
    `newsletter` = '1'

UNION

SELECT 
    `email` AS `emailTOT`
FROM
    `oc_journal2_newsletter`

UNION

SELECT 
    `email` AS `emailTOT`
FROM
    `oc_d_newsletter_subscriber`
WHERE
    `language_id` = '2' AND 
    `subscribed` = '1'
ORDER BY `emailTOT` ASC

【讨论】:

  • 嗨 Digital_Aaron,感谢您提供这个简化版本。它在 phpmyadmin 和 Maestro Anysql 上运行顺利,并且确实没有重复。它解决了我的问题!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2013-04-14
  • 2013-06-19
相关资源
最近更新 更多