php - 如何通过两个 AND 条件过滤一列?

标签 php mysql sql where-clause

问题已解决。但如果您有“更好”或其他方法可以做到这一点,请随时添加评论!感谢大家的阅读! :)

我正在尝试进行动态查询。除了一件事之外,一切都运行良好。我已经用 Google 搜索了好几天,但我不知道如何才能完成以下工作;

SELECT project.name, project.description, track.name, track.description
   , SDG.position, SDG.title, SDG.description
   , sprint_numbers.number, sprint_options.option
   , resources.name, resources.description
   , URLs.URL 
FROM project INNER JOIN track ON project.track_id = track.id 
INNER JOIN project_SDG ON project.id = project_SDG.project_id 
INNER JOIN SDG ON project_SDG.SDG_id = SDG.id
INNER JOIN sprint ON sprint.project_id = project.id 
INNER JOIN sprint_numbers ON sprint_numbers.id = sprint.sprint_number_id 
INNER JOIN sprint_options ON sprint_options.id = sprint.sprint_option_id 
INNER JOIN resources ON project.id = resources.project_id 
INNER JOIN URLs ON URLs.id = resources.id 
WHERE 1=1 
   AND MATCH (project.name) AGAINST (:name_project) 
   AND MATCH (project.description) AGAINST (:description_project) 
   AND SDG.id = :SDG_1 
   AND SDG.id = :SDG_2

查询执行但不返回任何内容。问题是 SDG.id 不能同时适用于 :SDG_1 和 :SDG_2。

使用 OR 运算符可以工作,但这并不能按照我想要的方式返回它。它必须“充当”AND 运算符。 (:SDG_1 & :SDG_2 是绑定(bind)到 SQL 语句参数的 PHP 变量的名称。)

查询应过滤这两个值。给:SDG_1 和:SDG_2 的值必须都存在于project_SDG 表的SDG.id 列中。如果 :SDG_1 的值存在,但 :SDG_2 不存在,则查询不应返回任何内容。

我在 StackOverflow 上找到了这个,但它对我不起作用:SELECTING with multiple WHERE conditions on same column

希望有人能帮助我。

编辑:最小可重现示例

查询:

SELECT * FROM project
INNER JOIN project_SDG ON project.id = project_SDG.project_id 
INNER JOIN SDG ON project_SDG.SDG_id = SDG.id
WHERE SDG.id = 1 AND SDG.id = 7 AND SDG.id = 14 AND SDG.id = 17

项目表

+------------------+---------------------------+------------+
|     id  name     |        description        |  track_id  |
+------------------+---------------------------+------------+
| 1   project name | This is a description   2 |            |
+------------------+---------------------------+------------+

可持续发展目标表

+-----+-----------+-------------+---------------------------------------------+
| id  | position  |   title     |                 description                 |
+-----+-----------+-------------+---------------------------------------------+
|   1 |         1 | SDG 1 to 17 | There're multiple SDGs ranging from 1 to 17 |
|  17 |        17 | SDG 1 to 17 | There're multiple SDGs ranging from 1 to 17 |
+-----+-----------+-------------+---------------------------------------------+

project.SDG(桥接表)

+------------+--------+
| project.id | SDG.id |
+------------+--------+
|          1 |      1 |
|          1 |      2 |
|          1 |      3 |
+------------+--------+

最佳答案

您希望每个 project.idSDG.id 都存在 :SDG_1:SDG_2 值>,所以在 WHERE 子句中使用它:

WHERE 1=1 
    AND MATCH (project.name) AGAINST (:name_project) 
    AND MATCH (project.description) AGAINST (:description_project) 
    AND project.id IN (
        SELECT project_id
        FROM project_SDG
        WHERE SDG_id IN (:SDG_1, :SDG_2)
        GROUP BY project_id
        HAVING COUNT(DISTINCT SDG_id) = 2
    ) 

关于php - 如何通过两个 AND 条件过滤一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471903/

相关文章:

sql - MySQL:通过 auto_increment 列的值检查新记录是否不好?

mysql - 如何在不发生 Rails 冲突的情况下将相同的数据分发给多个用户

mysql - 从一个表连接到另一个表中选择最近的结果

sql - MySQL 中的索引 CHAR(255) 字段......它是最佳的吗?

javascript - 如何让输入法只允许输入两位小数?

php - PHP并行/分布式工具和MySQL,以及如何跨多个服务器锁定功能

php - 如何优化我的查询以免达到最大执行时间?

php - 如何使用 PHP 安装并启动 tesseract-ocr

php - 重定向功能不起作用

mysql - 选择 'one has many' mySQL 查询