mysql - 使用 Like AND Like - Not Or 调用 object_id 的 SQL 语句

标签 mysql sql

一如既往地提前感谢您的帮助。我已经被这个问题困扰了好几天了,无法理解它。最后的努力张贴在这里。

我想要实现的目标 - 获取所有与“house”和“nightclub”匹配的object_id

这涉及到连接 3 个表以达到

WP_2_TERMS
--------------------------------------------------------
term_id    |    name    |    slug    |   term_group   |
  3          nightclub     nightclub        0
  41           house        house-3         0
--------------------------------------------------------

WP_2_TAXONOMY
-------------------------------------------------------
term_taxonomy_id    |    term_id    |    taxonomy    | 
         3                  3            category
         42                 41            Music
-------------------------------------------------------

WP_2_TERM_RELATIONSHIPS
-------------------------------------------------------
object_id    |    term_taxonomy_id    |    term_order    | 
    13                   4                     0
    13                   42                    0
    65                   3                     0
    65                   42                    0
    111                  3                    0

-------------------------------------------------------

所以理想情况下,sql 只会输出 object_id 65 但目前它返回 0 行

到目前为止,这就是我所拥有的。谁能看到我做错了什么,并愿意解释一下吗?

SELECT `rel`.`object_id`
    FROM `wp_2_term_relationships` as `rel`
    INNER JOIN `wp_2_term_taxonomy` as `tax` ON rel.term_taxonomy_id = tax.term_taxonomy_id
    LEFT JOIN `wp_2_terms` as `terms` ON tax.term_id = terms.term_id 
    LEFT JOIN `wp_2_terms` as `terms2` ON tax.term_id = terms2.term_id 
    WHERE terms.name LIKE '%house% AND terms2.name LIKE '%nightclub%'

另外,是的,我知道这可以通过 wp_query 完成,但我正在从 Wordpress 迁移,所以不幸的是,目前这是最好的解决方案!

最佳答案

您遇到的问题是,即使您连接表 wp_2_terms 两次,您还是连接到同一列 (tax.term_id),因此 terms.name 将始终与 terms2.name 相同,并且由于它们相同,因此它们不能同时是 nightclubhouse.

标准方法是使用GROUP BY/HAVING:

SELECT  rel.object_id
FROM    wp_2_term_relationships AS rel
        INNER JOIN wp_2_term_taxonomy AS tax 
            ON rel.term_taxonomy_id = tax.term_taxonomy_id
        INNER JOIN wp_2_terms AS terms
            ON tax.term_id = terms.term_id 
WHERE   terms.Name IN ('house', 'nightclub')
GROUP BY rel.object_id
HAVING  COUNT(DISTINCT terms.Name) > 1;

如果使用 LIKE 是强制性的而不是简单地等于,您可以重写为:

SELECT  rel.object_id
FROM    wp_2_term_relationships AS rel
        INNER JOIN wp_2_term_taxonomy AS tax 
            ON rel.term_taxonomy_id = tax.term_taxonomy_id
        INNER JOIN wp_2_terms AS terms
            ON tax.term_id = terms.term_id 
WHERE   terms.Name LIKE '%house%'
OR      terms.Name LIKE '%nightclub%'
GROUP BY rel.object_id
HAVING  COUNT(CASE WHEN terms.Name LIKE '%house%' THEN 1 END) >= 1
AND     COUNT(CASE WHEN terms.Name LIKE '%nightclub%' THEN 1 END) >= 1;

关于mysql - 使用 Like AND Like - Not Or 调用 object_id 的 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26235329/

相关文章:

php - SQL SELECT 到多个表

mysql - 编写一个查询,显示累计罚款超过 1000 的所有汽车的累计罚款总额

字段值的 MySQL 计数 + 分组

mysql - 这段SQL代码在添加PRIMARY KEY索引的解释

php - Laravel 使用集合对重复的表条目进行分组

mysql - 在 WHM/CPanel 环境中安装和维护 Percona Server

php - Joomla TPlancer 组件添加新字段并显示

php - 使用 PHP 从 SQL 表构建 html 列表树

mysql - 如何优化 MySQL 选择查询或使其更快

sql - 如何在 MS Access 中正确使用 "Not Equal"?