当前位置: 首页 > 知识库问答 >
问题:

MySQL独占行选择

百里星纬
2023-03-14

我有一个名为“survey_product”的表,其结构如下:

id int(11)
order_id int(11)
product_id int(11)
pq1 varchar(2)
pq2 varchar(2)
pq3 varchar(2)

此表存储通过系统订购的产品。

下面是该表中的一些数据记录:

(1, 2, 20, '1', '1', 'y')
(2, 2, 21, '1', 'y', 'y')
(3, 2, 22, '1', 'y', 'n')
(4, 2, 23, '1', 'y', 'y')
(5, 2, 24, '1', 'n', 'y')
(6, 3, 20, '1', 'n', 'y')
(7, 3, 24, '1', 'n', 'y')
(8, 3, 25, '1', 'n', 'y')
(9, 4, 20, '1', 'n', 'y')
(10, 4, 21, '1', 'n', 'y')
(11, 4, 23, '1', 'n', 'y')
(12, 4, 24, '1', 'n', 'y')

以上我们有3个订单(订单号2、3和4)。

我需要获取product\u id=21但product\u id=20的所有订单的order\u id(订单中的其他product\u id不相关-我只对21和20感兴趣)。

然后我需要知道product\u id为20和21的订单(同样,订单中的其他产品是不相关的)。

这是目前提取特定产品的所有订单的基本查询:

SELECT order_id FROM survey_product 
WHERE product_id = 20
AND (pq1 = '1' OR pq1 = '2' OR pq1 = '3')

关于我如何实现这一目标,有什么想法吗?

我试过了

SELECT order_id FROM survey_product 
WHERE product_id IN (20) AND product_id NOT IN (21)
AND (pq1 = '1' OR pq1 = '2' OR pq1 = '3')

但它也排除了所有其他值。

谢谢。

共有2个答案

卜阳
2023-03-14

我通常通过在WHERE条件中使用嵌套查询来做到这一点:

SELECT order_id
FROM survey_product
WHERE product_id = 21
AND pq1 IN ('1', '2', '3')
AND order_id NOT IN (
    SELECT order_id 
    FROM survey_product
    WHERE product_id = 20)

基本上,您可以从product\u id=20的行中找到所有order\u id,然后将其从主查询中排除,也就是说,您可以从product\u id=21的行中选择order\u id,但不在子查询产生的order\u id中。

闾丘谦
2023-03-14

在这种情况下,使用JOIN而不是嵌套查询通常是有益的:

    SELECT sp.order_id
      FROM survey_product AS sp
 LEFT JOIN 
           (SELECT order_id FROM survey_product WHERE product_id = 20) AS sp_t
        ON sp.order_id = sp_t.order_id
     WHERE sp_t.order_id IS NULL
       AND sp.product_id = 21
       AND sp.pq1 IN ('1', '2', '3')

获取order_idproduct_id中同时包含20和21的查询类似:您只需使用INNER JOIN而无需检查sp_t.order_id。或者保持原样,但如果您很懒,请将IS NULL替换为IS Not NULL-但我想这会运行得更慢。)

这里有一把SQL小提琴可以玩。

 类似资料:
  • 我在第一个事务中运行以下查询: 然后是第二个,来自不同的连接,这是完全相同的。在,它正在等待。 然后我运行下面的代码来查看锁 它显示行锁(ROW SHARE,ROW EXCLUSVE),这很好。但我也看到了 根据文档来自: 通过ALTERTABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER和VACUUM FULL命令获取。这也是未显式指定模式的lock TABLE语句

  • 本文向大家介绍解决layui的input独占一行的问题,包括了解决layui的input独占一行的问题的使用技巧和注意事项,需要的朋友参考一下 1.input标签独占一行,与button标签无法同行显示 (使用position属性进行设置,position属性详见。) 解决方法: 一.对button的position进行设置,使之与input同行。 二.将input与button放在一个大div中

  • 我有以下功能,由多个进程同时使用。但是我有时会在插入操作中遇到重复错误。我认为这是锁的问题,所以我改成了 ACCESS EXCLUSIVE 锁,但这不好,因为它锁定了整个桌子。使用共享行独占模式似乎可以正常工作,但我对性能和访问有一些疑问。其他进程将能够访问该表?与前一个锁相比,此锁更慢(行独占)?

  • 在分布式Java桌面应用程序通过JDBC访问的特别请求的DB2表中,我每天都会多次收到以下场景: > 客户机A想要插入新的寄存器,并在表上获得一个IX锁,X锁在每个新行中; 其他客户端想要执行SELECT,被授予表上的IS锁,但应用程序卡住了; 客户机A继续工作,但是插入和更新查询没有被提交,锁没有被释放,并且它继续收集X个锁到每一行; 客户端 A 退出,其工作未提交。其他客户端最终获取其 SEL

  • 本文向大家介绍MySQL LIMIT选择单行,包括了MySQL LIMIT选择单行的使用技巧和注意事项,需要的朋友参考一下 要在MySQL中选择一行,可以使用LIMIT。首先,让我们创建一个表。创建表的查询如下- 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出- 这是使用LIMIT从表中选择一行的查询- 以下是输出-

  • 问题内容: 我有一个mysql问题。 我的网站上有一个新闻版块,我想显示两个最新项目。如果我做: 它选择了最新的项目,现在我要选择倒数第二个项目。 你们知道怎么做吗? /// 编辑 现在它不起作用了,这是我的代码:(我已经包含了;)) 问题答案: -选择最后2个项目 -仅选择第二项