【问题标题】:Mysql - Verify if part of a result exists in another tableMysql - 验证结果的一部分是否存在于另一个表中
【发布时间】:2018-03-25 20:41:51
【问题描述】:

我在 Mysql 中有两个表,一个是我需要向用户显示的所有数据,另一个是已删除项目的 URL 列表。

我想要做的是选择所有结果,只要该元素不存在于“已删除项目”表中。

在我的“Deleted_Items”表中,我有一个类型的 URL 列表

https://example.com/video/123456/

但在我的“项目”表中,URL 列包含以下内容:

https://example.com/video/123456/dogs_and_cats/

我需要做这样的事情(伪代码):

SELECT id, url, thumb FROM Items
WHERE Items.url NOT CONTAINS Deleted_Items.url

附注: 我有一个与其他两个表类似的情况,但不同之处在于,在“Items”表中我有一个 ID 列表,在“Deleted_Items”表中我也有一个 ID 列表,所以我应用了以下查询:

SELECT id, url, thumb
FROM Items
LEFT OUTER JOIN Deleted_Items 
ON (Items.url = Deleted_Items.url) 
WHERE Deleted_Items.url IS NULL
LIMIT 30

【问题讨论】:

  • 使用与“ID 列表”查询相同的反连接模式。似乎匹配条件(在 ON 子句中)类似于ON items.url LIKE CONCAT('%',deleted_items.url,'%')。 (LIKE 比较的潜在陷阱是_% 通配符。)LIKE 比较的替代方法是正则表达式比较REGEXP(使用带有特殊字符的更复杂的规则),或者使用@ 987654330@ 或 LOCATE() 函数。

标签: php mysql sql string search


【解决方案1】:

您可以使用左连接检查 deleted_item.url 是否为空

 SELECT Items.id, Items.url, .Itemsthumb 
 FROM Items
 LEFT JOIN deleted_Items  ON Items.url  = deleted_Items.url
 where deleted_Items.url is null 

查看您添加的数据样本可能需要类似的比较

 SELECT Items.id, Items.url, .Itemsthumb 
 FROM Items
 LEFT JOIN deleted_Items  ON  deleted_Items.url like concat(Items.url , '%')
 where deleted_Items.url is null 

【讨论】:

  • 但是比较起来会有问题吗? “Deleted_Items”中的 URL 列表包含“example.com/video/123456”类型的 url,“Items”包含“example.com/video/123456/dogs_and_cats”类型的 url
  • 感谢您的帮助,这可行,但由于某种原因,当我尝试添加“ORDER BY ...”时,这句话不起作用。这句话需要很长时间才能工作。
  • 如果查询在没有 order by 的情况下工作并产生正确(未排序)的结果,这意味着查询工作正常。您应该将 tha 答案评为正确和/或至少有用 ..。如果有或没有 order by 的查询很慢,这是另一个问题,您应该发布一个与性能特别相关的新问题..在获得正确的问题后更改问题的术语是不公平的..
猜你喜欢
  • 2021-08-07
  • 2023-02-02
  • 2020-09-12
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多