请教一个sql语句,我实现这个目前需要查两次和求交集才能取到,如何使用一个sql查到呢

表示例#

id m_id price unit
1 28 100
2 28 200
3 29 120
4 29 150
4 30 180
4 30 130

目标#

找出所有同时满足 price 大于 160 的,unit 为年的 和 price 小于 110,unit 为月的所有 m_id

我现在的做法#

先查所有年的 price 大于 160 的 m_id, (28,30)
再查所有月的 price 小于 110 的 m_id, (28)
然后取出 mid, 求交集得出 28

请问还有更好的方式求出这个 28 吗#

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案
select a.m_id from ((select m_id from table_name where price > 160 and unit = "年") as a  INNER JOIN (select m_id from table_name where price < 110 and unit = "月") b on a.m_id = b.m_id)

如果在表里面 unit 相同且 m_id 相同的超过两条,最后需要加上 group by

select a.m_id from ((select m_id from table_name where price > 160 and unit = "年") as a  INNER JOIN (select m_id from table_name where price < 110 and unit = "月") b on a.m_id = b.m_id) group by a.m_id
1年前 评论
uuxintiao (楼主) 1年前
uuxintiao (楼主) 1年前
lihuijun 1年前
讨论数量: 29
select * from a where (price >160 and unit = '年') or (price <110 and unit = '月')
1年前 评论
uuxintiao (楼主) 1年前
风吹过有夏天的味道 (作者) 1年前
浮心 1年前

我觉得这个问题,文心一言绰绰有余,都不用通义灵码就能搞定~楼上就是答案

1年前 评论
uuxintiao (楼主) 1年前
select a.m_id from ((select m_id from table_name where price > 160 and unit = "年") as a  INNER JOIN (select m_id from table_name where price < 110 and unit = "月") b on a.m_id = b.m_id)

如果在表里面 unit 相同且 m_id 相同的超过两条,最后需要加上 group by

select a.m_id from ((select m_id from table_name where price > 160 and unit = "年") as a  INNER JOIN (select m_id from table_name where price < 110 and unit = "月") b on a.m_id = b.m_id) group by a.m_id
1年前 评论
uuxintiao (楼主) 1年前
uuxintiao (楼主) 1年前
lihuijun 1年前

其实大家可能会有疑问,为什么我不把 price 分为 month_price 和 year_price, 这样就简单了,但有原因的,这个单位是自定义的,它可以有 10 天,10 周等任意单位,图上示例只写了月和年

1年前 评论

SELECT a.* FROM table1 a INNER JOIN table2 b ON a.id = b.id WHERE a.price >160 and a.unit = ' 年 ' and b.price <110 and b.unit = ' 月 ';

一个查询,但是 join 的缺点都知道吧

1年前 评论
uuxintiao (楼主) 1年前
小猪蹄子 1年前
小猪蹄子 1年前
小猪蹄子 1年前
uuxintiao (楼主) 1年前
小猪蹄子 1年前
Harry_Bmdr 1年前

就我觉得你的做法才是正确的,简单的查询,结果集取交集即可。能不 join 就不 join。

1年前 评论
DROP TABLE `test`;
CREATE TABLE `test` (
  `id` bigint(5) NOT NULL AUTO_INCREMENT,
  `m_id` bigint(20) DEFAULT NULL,
  `price` tinyint(3) unsigned DEFAULT NULL,
  `unit` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;

INSERT INTO test (`m_id`, `price`, `unit`) VALUES (28, 100, '月');
INSERT INTO test (`m_id`, `price`, `unit`) VALUES (28, 200, '年');
INSERT INTO test (`m_id`, `price`, `unit`) VALUES (29, 120, '月');
INSERT INTO test (`m_id`, `price`, `unit`) VALUES (29, 150, '年');
INSERT INTO test (`m_id`, `price`, `unit`) VALUES (30, 180, '年');
INSERT INTO test (`m_id`, `price`, `unit`) VALUES (30, 130, '月');

SELECT
    testA.m_id 
FROM
    test testA 
WHERE
    EXISTS ( SELECT testB.m_id FROM test testB WHERE testB.price > 160 AND testB.unit = '年' AND testA.m_id = testB.m_id ) 
    AND testA.price < 110 
    AND testA.unit = '月';
1年前 评论

select distinct mid from table where mid in (select mid from table where 条件 1) and 条件 2;

1年前 评论

这样可以不

SELECT m_id
FROM table_name
WHERE (price > 160 AND unit = '年')
   OR (price < 110 AND unit = '月')
GROUP BY m_id
HAVING count(*) > 1;
1年前 评论
徵羽宫 1年前
uuxintiao (楼主) 1年前
徵羽宫 1年前
浮心 (作者) 1年前

也可以试试这种方式,看看是不是更容易理解。

with a as (SELECT m_id FROM test WHERE price > 160 AND unit = '年' group by m_id),
     b as (SELECT m_id FROM test WHERE price < 110 AND unit = '月' group by m_id)
select a.m_id
from a
         left join b on a.m_id = b.m_id
where b.m_id is not null
with a as (SELECT m_id FROM test WHERE price > 160 AND unit = '年' group by m_id),
     b as (SELECT m_id FROM test WHERE price < 110 AND unit = '月' group by m_id)
select a.m_id
from a
    inner join b on a.m_id = b.m_id;
1年前 评论

-- 假设表名是 table_name

select
    unit_year.mid
from
    table_name unit_year
    inner join table_name unit_month on unit_year.mid = unit_month.mid
where
    unit_year.unit = "year"
    and unit_year.price > 160
    and unit_month.unit = "month"
    and unit_month.price < 110
group by
    unit_year.mid
1年前 评论