Php 如何按两个条件过滤一列?

Php 如何按两个条件过滤一列?,php,mysql,sql,where-clause,Php,Mysql,Sql,Where Clause,问题已经解决了。但是如果你有更好的方法或者其他的方法,那么请随意添加评论!谢谢大家的阅读 我正在尝试进行动态查询。除了一件事,一切都很好。我已经用谷歌搜索了好几天,但我不知道如何才能做到以下几点: SELECT project.name, project.description, track.name, track.description , SDG.position, SDG.title, SDG.description , sprint_numbers.number, sprin

问题已经解决了。但是如果你有更好的方法或者其他的方法,那么请随意添加评论!谢谢大家的阅读

我正在尝试进行动态查询。除了一件事,一切都很好。我已经用谷歌搜索了好几天,但我不知道如何才能做到以下几点:

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是绑定到SQL语句参数的PHP变量的名称

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

我在StackOverflow上找到了这个,但它对我不起作用:

我希望有人能帮助我

编辑:最小可复制示例

查询:

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 |            |
+------------------+---------------------------+------------+
SDG表

+-----+-----------+-------------+---------------------------------------------+
| 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 |
+------------+--------+
你能为你的问题提供一个答案吗? 一般来说,一个字段不能同时等于两个不同的值。因此,您要么混淆了逻辑运算符,要么需要两个不同的字段

我可以假设,在您的情况下,可能有几个具有不同值的相关记录。在这种情况下,需要使用不同的别名连接同一个表两次。假设为SDG1和SDG2。然后你可以比较

... `SDG1`.id = :SDG_1 AND `SDG2`.id = :SDG_2
更新:

赢的诀窍是分组。您可以枚举所有必需的SDG ID,并计算它们在组中的数量。例如,在两个ID的情况下:

选择project.id 从项目 在project\u SDG.project\u id=project.id上加入project\u SDG 在SDG.id=project\u SDG.SDG\u id上加入SDG 其中SDG.id为1,2 按project.id分组 计数*=2的 在这里查看我的沙盒:

如果您需要所有项目的字段,则必须将其作为子查询

... 此处子查询中的何处id 子查询示例:

您希望每个project.id都有SDG.id的两个值:SDG_1和:SDG_2,因此在WHERE子句中使用:


我已经回答了,但我有另一种方法

1.查找与某个项目关联的一组ID 要查找项目ID,我们可以在没有任何联接的情况下测试数据透视表:

从project_SDG中选择project_id 其中SDG_id为1,2,6 按项目编号分组,计数*=3 它为我们提供了项目ID列表

2.访问所有项目字段并添加额外条件 选择项目* 从项目 参加 从project_SDG中选择project_id 其中SDG_id为1,2,6 按项目编号分组,计数*=3 作为ids.project\u id=project.id上的id 哪里 将project.name与“project”匹配,并 根据“sit”匹配Project.description 你可以在这里玩:

3.在PHP端准备查询 我将用它来准备SQL语句

$ids=[1,2,6];//它可以来自请求参数 $text1='project'; $text2='sit'; //建造?,?,?,。。。图案 $qmarks=内爆“,”,数组填充0,计数$id“?”; //使用上面的SQL查询 $sth=$dbh->prepare 选择项目* 从项目 参加 从project_SDG中选择project_id 其中SDG_id位于{$qmarks} 按项目\u id分组,计数*=? 作为ids.project\u id=project.id上的id 哪里 将project.name与和匹配 匹配project.description ; $sth->executearray_merge$id,[count$id,$text1,$text2]; $records=$sth->fetchAll;
-请张贴您的表格结构和记录。正确。表行中的单个字段不能有多个值。通常,这类问题需要像tableA行这样的行,其中tableB行的每个值都提供了,但这就引出了一个问题,在这种情况下,哪个B行应该用于SELECT子句中的值。我确实用更多信息更新了我的问题。多次连接表实际上是不可行的。我无法为17个SDG创建17个单独的表。抱歉搞混了,里面有超过2,17个total@May谢谢你的更新。我会相应地更新我的答案。我明白了,谢谢你的回复。你的小提琴似乎很好用!但是,当我尝试在WHERE子句之后添加所有内容时,会收到一条错误消息1055。我确实认为您的解决方案比另一个好,但我似乎不明白为什么它在我自己的查询中不起作用。我必须先研究1055和非聚集列,然后才能将您的列实现到我自己的查询中。谢谢你的帮助!我真的很感激你经历的所有麻烦是的,你说得对。两个或更多值。这取决于用户选择的内容。在我的示例中,我使用了:SDG_1和SDG_2,但其范围为1到17。我尝试了这个查询,但它没有返回任何内容。在发布之前,我尝试了完全相同的方法,我将PHP变量:SDG_1&:SDG_2替换为1,2。这些值存在于列中,但我确实存在
无法返回结果。IN后的子查询将返回所有project.id,其中包含两个值:SDG_1和:SDG_2。我试图在没有任何联接的情况下简化它,所以我只使用了包含列project\u id和列SDG\u id的表project\u SDG。我很抱歉。我感谢你!它起作用了!但你确实让我很难让我的查询充满活力。我希望会有一个更优雅的解决方案。但如果成功了,那就成功了!再次感谢!我可以从这里找到剩下的。
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
    )