当前位置: 首页 > 面试题库 >

如果两个条件在子记录的不同行上匹配,则使用高级MySQL查询来获取主记录

陆洛城
2023-03-14
问题内容

我正在编写一个mysql筛选器查询,该查询具有一个主表和另一个表,该表针对主表的每个记录保存多个记录(我将其称为表子)。

我试图编写一个查询,该查询根据子表上的值获取主表的记录。如果子表条件为1,那么我将可以简单地通过加入来完成,但是我有2个条件属于同一字段。

For ex.
table 1:
id   name  url
1    XXX   http://www.yahoo.com
2    YYY   http://www.google.com
3    ZZZ   http://www.bing.com

table 2:
id masterid optionvalue
1  1        2
2  1        7
3  2        7
4  2        2
5  3        2
6  3        6

optionvalue第二个表上只有两个不同条件都匹配时,我的查询必须返回唯一的主记录。我用IN编写查询…

select * from table1 
left join table2 on table1.id=table2.masterid 
where table2.optionvalue IN(2,7) group by table1.id;

这使我获得了所有3条记录,因为IN基本上是在检查“ OR”,但是在我的情况下,我不应该获得第3条主记录,因为它的值是2,6(没有7)。如果我用“
AND”写查询,则没有任何记录…

select * from table1 
left join table2 on table1.id=table2.masterid 
where table2.optionvalue = 2 and table2.optionvalue = 7;

这将不会返回的记录,并且会因为无法检查同一列上的不同值而失败。我想编写一个查询,以获取具有子记录的主记录,该子记录的字段optionvalues将2和7都保存在不同的记录上。

任何帮助将非常感激。


问题答案:

确实,正如AsConfused所暗示的那样,您需要使用别名对TABLE2进行两次联接

- both of these are tested

-- find t1 where it has 2 and 7 in t2

    select t1.*
    from table1 t1
    join table2 ov2 on t1.id=ov2.masterid and ov2.optionValue=2
    join table2 ov7 on t1.id=ov7.masterid and ov7.optionValue=7

-- find t1 where it has 2 and 7 in t2, and no others in t2

select t1.*, ovx.id
    from table1 t1
      join table2 ov2 on t1.id=ov2.masterid and ov2.optionValue=2
      join table2 ov7 on t1.id=ov7.masterid and ov7.optionValue=7
      LEFT OUTER JOIN table2 ovx on t1.id=ovx.masterid and ovx.optionValue not in (2,7)
    WHERE ovx.id is null


 类似资料:
  • 本文向大家介绍MySQL查询找到匹配项并获取记录,包括了MySQL查询找到匹配项并获取记录的使用技巧和注意事项,需要的朋友参考一下 要从记录中查找匹配项,请使用MySQL 。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是查找与ID 1和11匹配并获取记录的查询- 这将产生以下输出-

  • 问题内容: 我的数据库表中具有以下格式的数据: 该列将来自该列的数据作为父记录。带有值的表示根项目。我需要编写查询以按以下顺序获取数据: 我需要得到根记录(与记录为0),然后是所有和这根记录,然后获得下根的记录,然后和在这个根记录等等。 问题答案: 我在这里提出的解决方案使用了物化路径的概念。以下是使用样本数据的实例化路径的示例。我希望它可以帮助您理解物化路径的概念: 每个节点都有一个实例化路径,

  • 如何在SL4J中配置日志记录?我的项目有很多类:class1、class2、Class3....我想做两件事:将所有类记录到一个名为FILE1的文件追加器中,并具有警告级别(class1、class2、class3...)将一个名为class1的类记录到具有调试级别的名为FILE2的文件追加器中。 问题是,当我将class1的记录器配置为具有WARN级别的FILE1 appender时,我不知道如

  • 问题内容: 我已经在hbm文件中添加了复合文件,如下所示 现在我想查询如下 我没有得到相同的结果,因为有一个引用EmployeeSignId的组合键。在这种情况下,如何创建条件查询? 我在下面尝试过但得到0条记录 问题答案: 问题已解决。 我尝试了下面的工作

  • 问题内容: 我正在使用SQL Server 2008。 下面是一个示例记录集。 我想每次更改“值”时都要查询一次。例如,我想要第1、9、14、26、28、37和50行。 我曾尝试使用SELECT DISTINCT,但这不起作用,因为“值”列具有重复的值(即第1行和第14行)。 我已经搜索了一段时间,但没有找到解决方案。如果您有一个,请告诉我!谢谢! 问题答案: 在最新版本的SQL Server中,

  • 在Mongodb中,我想获取那些没有任何订单的产品的数据。 集合:master_product_details、master_order_details 我使用的是普通的$lookup查询,它给出了与Order匹配或不匹配的所有记录。 还有其他方法可以得到结果吗?