Mysql 按4个表进行SQL查询组合搜索
我在使用MySQL时遇到了一个SQL查询问题 我有一些表格,它们必须找到一个输出,在那里它们必须相乘 第一表:Mysql 按4个表进行SQL查询组合搜索,mysql,sql,Mysql,Sql,我在使用MySQL时遇到了一个SQL查询问题 我有一些表格,它们必须找到一个输出,在那里它们必须相乘 第一表: ID | name | mass | hg | 1 | PC 32:2 | 700 | PC | 2 | PC 32:1 | 800 | PC | 第二个表FA: ID | name | mass 1 | FA 16:1 | 300 2 | FA 16:0
ID | name | mass | hg |
1 | PC 32:2 | 700 | PC |
2 | PC 32:1 | 800 | PC |
第二个表FA:
ID | name | mass
1 | FA 16:1 | 300
2 | FA 16:0 | 400
3 | FA 16:2 | 200
a
第三表类别:
ID | name | snpos | backbone | LC
1 | gpl | 2 | 25 | 1
第四表LC:
ID | name | mass
1 | PC | 75
我需要一个SQL查询,可以给我一个结果,我使用的东西从所有4个表
我需要一个结果,它可以给我FA的表2的哪个成分,它可以给我表1的正确输入
所以我将输入hg=PC和mass=700。根据这些信息,它应该告诉我它可能是哪种FA成分
从表3 cat中,它应该使用snpos信息来确定在这种情况下它应该找到多少FA,并且主干应该添加到与表4 LC中的质量相同的结果中,否则它将永远无法达到输入质量
它看起来像:
FA 16:1 FA 16:1 (mass 600) + PC (mass 75) + backbone (25) = 700
这并不是一个确定的解决方案,甚至也不是一个方法的主张;只是一个原则的证明
DROP TABLE IF EXISTS lipid;
CREATE TABLE lipid
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(12) NOT NULL UNIQUE
,mass INT NOT NULL
,hg CHAR(2) NOT NULL
);
INSERT INTO lipid VALUES
(1 ,'PC 32:2',700,'PC'),(2,'PC 32:1',800,'PC');
DROP TABLE IF EXISTS FA;
CREATE TABLE FA
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(12) NOT NULL
,mass INT NOT NULL
);
INSERT INTO fa VALUES
(1 ,'FA 16:1',300),
(2 ,'FA 16:0',400),
(3 ,'FA 16:2',200);
DROP TABLE IF EXISTS Cat;
CREATE TABLE Cat
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(12) NOT NULL
,snpos TINYINT NOT NULL
,backbone INT NOT NULL
,LC INT NOT NULL
);
INSERT INTO Cat VALUES
(1 ,'gpl',2,25,1);
DROP TABLE IF EXISTS LC;
CREATE TABLE LC
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name CHAR(2) NOT NULL
,mass INT NOT NULL
);
INSERT INTO LC VALUES (1,'PC',75);
SELECT l.id lipid_id
, l.name lipid_name
, l.mass lipid_mass
, l.hg
, fa.*
, c.id cat_id
, c.name cat_name
, c.snpos snpos
FROM lipid l
JOIN lc
ON lc.name = l.hg
JOIN cat c
ON c.lc = lc.id
JOIN
( SELECT 3 snpos,x.name name_x,x.mass mass_x,y.name name_y,y.mass mass_y,z.name name_z,z.mass mass_z, x.mass+y.mass+z.mass total FROM fa x JOIN fa y ON y.id < x.id JOIN fa z ON z.id < y.id
UNION
SELECT 2 ,x.name, x.mass,y.name,y.mass,NULL,0, x.mass+y.mass FROM fa x JOIN fa y ON y.id < x.id
UNION
SELECT 1,name,mass,NULL,0,NULL,0, mass FROM fa
) fa
ON fa.snpos = c.snpos
AND fa.total = 700-c.backbone-lc.mass
WHERE l.mass = 700
AND l.hg = 'PC';
+----------+------------+------------+----+-------+---------+--------+---------+--------+--------+--------+-------+--------+----------+-------+
| lipid_id | lipid_name | lipid_mass | hg | snpos | name_x | mass_x | name_y | mass_y | name_z | mass_z | total | cat_id | cat_name | snpos |
+----------+------------+------------+----+-------+---------+--------+---------+--------+--------+--------+-------+--------+----------+-------+
| 1 | PC 32:2 | 700 | PC | 2 | FA 16:2 | 200 | FA 16:0 | 400 | NULL | 0 | 600 | 1 | gpl | 2 |
+----------+------------+------------+----+-------+---------+--------+---------+--------+--------+--------+-------+--------+----------+-------+
解决背包问题是SQLServer不打算做的事情-snpos可能包含哪些范围的值?可能不是vesper,可能我将在PHP中执行一些变量,然后将它们放入查询中。但我希望你们知道一个解决方案,因为这将使只使用sql变得更容易。@snpos可能包含1-3的范围。我想你们肯定有一些东西。我只需要做一些测试,我会回来的。非常感谢,这是非常有用的,很好的解决方案: