gpt4 book ai didi

mysql - 带有 GROUP_CONCAT 的动态 IN+IF 子句?

转载 作者:行者123 更新时间:2023-11-29 12:38:03 25 4
gpt4 key购买 nike

我正在筛选给定特性(一个)的买家(许多),主要条件为

  • 如果买家需要具体的浴室数量 (buyers.bathroom_exact='1'),请将其与特性的浴室值(value)相匹配。

买家可以选择多个精确的浴室搭配。这是一个示例架构:

CREATE TABLE `buyers` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`bathroomreq` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `buyers_bathrooms` (
`buyer_id` int(10) unsigned NOT NULL DEFAULT '0',
`number` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `buyers` ( name, bathroomreq ) VALUES ( 'John Doe', 1);
INSERT INTO `buyers` ( name, bathroomreq ) VALUES ( 'John Smith', 1);

INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 1, 8 );
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 1, 9 );
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 1, 10 );
INSERT INTO buyers_bathrooms ( buyer_id, number ) VALUES ( 2, 5 );

我能想到的唯一方法是使用具有 IF 子句的列来查看 Bathroomreq 是否为 1,然后匹配买家的 group_concat指定浴室:

SELECT IF ( bathroomreq = '1', 8 IN (
SELECT GROUP_CONCAT(number) AS bathrooms
FROM buyers_bathrooms
WHERE buyers.id = buyers_bathrooms.buyer_id
) , 1 ) AS bathroom_match,

bathroomreq,

id, name

FROM buyers

所以这个属性基本上有 8 个浴室,这就是为什么 8 是硬编码在那里的。

这是一个 mysql fiddle :

http://sqlfiddle.com/#!2/508cc/1

这是解决问题的唯一方法吗?可靠吗?如果 bathroomreq1,我可以用动态 INNER JOIN 之类的替代方法来实现吗?基本上,我是否可以避免在应用程序代码中基于 bathroom_match 进行分支,并仅通过 SQL 优雅地过滤它?

最佳答案

我认为你可以使用 exists 子句做你想做的事:

select b.bathroomreq, b.id, b.name,
(b.bathroomreq <> 1 or
exists (select 1
from buyers_bathrooms bb
where bb.buyer_id = b.id and bb.number = 8
)
) as bathroom_match
from buyers b;

关于mysql - 带有 GROUP_CONCAT 的动态 IN+IF 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com