【问题标题】:How do I remove results from a first MySQL query, if they exist in a second MySQL query?如果它们存在于第二个 MySQL 查询中,如何从第一个 MySQL 查询中删除结果?
【发布时间】:2014-10-22 09:06:51
【问题描述】:

如何从第一个查询中删除结果,如果它们存在于第二个查询中?

我查看了以前的 stackoverflow 线程,但仍然无法正常工作。

到目前为止,我的MySQL 查询如下:

SELECT roomL.CityCode, roomL.TableCode
FROM (SELECT roomL.CityCode, roomL.TableCode 
      FROM roomL
      WHERE roomL.StatusEnum = 1 
      AND roomL.TableCode NOT IN (select stock.TableCode from stock)
      AND roomL.TimeSeen BETWEEN 10/10/2014 AND Now())

WHERE NOT EXISTS (SELECT roomL.CityCode , roomL.TableCode 
                  FROM roomL
                  WHERE roomL.StatusEnum = 1 
                  AND roomL.TableCode NOT IN (select stock.TableCode from stock)
                  AND roomL.TimeSeen BETWEEN DATE_ADD( 17/10/2014 ,INTERVAL 1 DAY) AND Now())

目前我收到错误:

SQL 错误 (1248):每个派生表都必须有自己的别名

【问题讨论】:

  • 你介意和我一起跑一遍,如何通过示例进行这些更改?谢谢
  • 是的,他们每个人都会检索一组结果。
  • 很好,这是 roomL 的主键?

标签: mysql sql database mysql-error-1064


【解决方案1】:

试试这个:

SELECT temp1.CityCode, temp1.TableCode
FROM (SELECT roomL.CityCode, roomL.TableCode 
      FROM roomL
      WHERE roomL.StatusEnum = 1 
      AND roomL.TableCode NOT IN (select stock.TableCode from stock)
      AND roomL.TimeSeen BETWEEN '2014-10-10' AND Now())temp1

left join (SELECT roomL.CityCode , roomL.TableCode 
                  FROM roomL
                  WHERE roomL.StatusEnum = 1 
                  AND roomL.TableCode NOT IN (select stock.TableCode from stock)
                  AND roomL.TimeSeen BETWEEN DATE_ADD( '2014-10-17' ,INTERVAL 1 DAY) AND Now())temp2 
ON temp1.CityCode=temp2.CityCode AND temp1.TableCode=temp2.TableCode
WHERE temp2.CityCode IS NULL AND temp2.TableCode IS NULL;

【讨论】:

  • 为什么要使用子查询?
  • 为什么我得到 - 投票..我不知道..我的逻辑是正确的..使用子查询有什么问题..@Gervs
  • 把东西放进一个盒子然后再把那个盒子放进另一个盒子是不合逻辑的。此外,您使用了 wrong 日期格式,并且您对 NULL 比较的使用无效(应该是 IS [NOT] NULL)。足够的反对理由
  • @Gervs..在 mysql 上检查它是完美的语法......它正在工作。
  • 我对他的代码进行了更正...我没有检查日期格式..我不知道日期格式..但我的方法是正确的..
【解决方案2】:

首先使用正确的数据类型更改表,您需要先添加额外的列:

ALTER table roomL
ADD COLUMN TimeSeen1 DATE;

第二次更新来自字符串 im TimeSeen 的新列

UPDATE roomL
SET TimeSeen1 = STR_TO_DATE(TimeSeen, '%d/%m/%Y');

第三次删除旧列

ALTER TABLE roomL
DROP COLUMN TimeSeen;

最后重命名新列(可选)

ALTER TABLE roomL
CHANGE COLUMN TimeSeen1 TimeSeen DATE;

然后稍微调整一下就可以使用草莓的查询了:

SELECT
     r.CityCode,
     r.TableCode
FROM
    roomL r
LEFT JOIN
    stock s
    ON r.TableCode = s.TableCode
WHERE
    r.Status_Enum = 1 AND
    r.TimeSeen BETWEEN '2014-10-10' AND '2014-10-18'
    AND s.TableCode IS NULL

【讨论】:

  • 执行此操作后,我仍然收到错误 SQL Error (1248): Every derived table must have its own alias
  • 您不需要子查询,但如果您在 FROM 子句中使用子查询,则别名是必需的
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2014-03-28
  • 2018-12-18
相关资源
最近更新 更多