【发布时间】:2021-05-29 01:13:06
【问题描述】:
我有一个 MySQL-DB,它有三个表:药物、成分(两者都有 m:n 关系)和一个链接表/关联表。所以很明显一种药物可以有多种成分,并且成分可以存在于多种药物中。我想创建一个网站,我的用户可以在其中选择
DROP procedure IF EXISTS `getMeds`;
DELIMITER $$
USE `epharmacy`$$
CREATE PROCEDURE `getMeds` (IN all1 VARCHAR(10), IN all2 VARCHAR(10), IN all3 VARCHAR(10),
IN unall1 VARCHAR(10), IN unall2 VARCHAR(10), IN unall3 VARCHAR(10))
BEGIN
SELECT m_id, m_name, i_id, i_name FROM epharmacy.`mi_med-ing` INNER JOIN epharmacy.`m_medication`
INNER JOIN epharmacy.`i_ingredients`
ON mi_m_id = m_id AND mi_i_id = i_id
#Allowed
WHERE (i_id = all1 OR all1 = '')
AND (i_id = all2 OR all2 = '')
AND (i_id = all3 OR all3 = '')
#Unallowed
AND ((i_id!= unall1 OR unall1 = '')
AND (i_id != unall2 OR unall2 = '')
AND (i_id != unall3 OR unall3 = ''))
ORDER BY m_id ASC;
END
$$
DELIMITER ;
call getMeds('I005', 'I006', 'I007', 'I001', 'I002', 'I003');
但这不知何故不起作用。我应该得到两种药物作为回报,但我什么也没得到。我尝试了很多东西,比如子查询和其他 JOINS,但没有帮助。希望你能:)
编辑: 这就是我的数据库的样子: m_medication:
CREATE TABLE IF NOT EXISTS `m_medication` (
`m_id` varchar(10) NOT NULL,
`m_name` varchar(500) DEFAULT NULL,
PRIMARY KEY (`m_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `m_medication` (`m_id`, `m_name`) VALUES('M00001', 'drug1');
INSERT INTO `m_medication` (`m_id`, `m_name`) VALUES('M00002', 'drug2');
i_ingredients:
CREATE TABLE IF NOT EXISTS `i_ingredients` (
`i_id` varchar(10) NOT NULL,
`i_name` varchar(500) DEFAULT NULL,
PRIMARY KEY (`i_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `i_ingredients` (`i_id`, `i_name`) VALUES('I005', 'ingredient1');
INSERT INTO `i_ingredients` (`i_id`, `i_name`) VALUES('I006', 'ingredient2');
INSERT INTO `i_ingredients` (`i_id`, `i_name`) VALUES('I007', 'ingredient3');
mi_med-ing:
CREATE TABLE IF NOT EXISTS `mi_med-ing` (
`mi_id` varchar(10) NOT NULL,
`mi_i_id` varchar(10) DEFAULT NULL,
`mi_m_id` varchar(10) DEFAULT NULL,
PRIMARY KEY (`mi_id`),
KEY `mi_i_id` (`mi_i_id`),
KEY `mi_m_id` (`mi_m_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO mi_med-ing (mi_id, mi_i_id, mi_m_id) VALUES('MI001', 'I005', 'M00001');
INSERT INTO mi_med-ing (mi_id, mi_i_id, mi_m_id) VALUES('MI002', 'I006', 'M00001');
INSERT INTO mi_med-ing (mi_id, mi_i_id, mi_m_id) VALUES('MI003', 'I007', 'M00001');
INSERT INTO mi_med-ing (mi_id, mi_i_id, mi_m_id) VALUES('MI004', 'I005', 'M00002');
INSERT INTO mi_med-ing (mi_id, mi_i_id, mi_m_id) VALUES('MI005', 'I006', 'M00002');
INSERT INTO mi_med-ing (mi_id, mi_i_id, mi_m_id) VALUES('MI006', 'I007', 'M00002');
外键:
ALTER TABLE `mi_med-ing`
ADD CONSTRAINT `mi_med-ing_ibfk_1` FOREIGN KEY (`mi_i_id`) REFERENCES `i_ingredients` (`i_id`),
ADD CONSTRAINT `mi_med-ing_ibfk_2` FOREIGN KEY (`mi_m_id`) REFERENCES `m_medication` (`m_id`);
【问题讨论】:
-
要添加样本数据和预期输出neebs..
-
您正在尝试匹配同一行中的多个成分 ID,而不是按药物对行进行分组。
-
请参阅stackoverflow.com/questions/16704290/…,了解如何获得包含所有成分的药物。
-
然后使用
NOT IN过滤掉不需要的药物 -
@P.Salmon 我有一些,这就是为什么我期待两个结果。
标签: mysql database stored-procedures subquery