Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 八个表中的多个JOIN和SELECT语句_Mysql_Sql_Labview - Fatal编程技术网

Mysql 八个表中的多个JOIN和SELECT语句

Mysql 八个表中的多个JOIN和SELECT语句,mysql,sql,labview,Mysql,Sql,Labview,我试图创建一个SQL语句,它接受八个不同的数字,并从一个数据库中搜索八个不同的表以获得相应的值。我不断得到无效的语法,但我不明白为什么。这是我的密码: SELECT cable_length.ID, drawing.ID, optional.ID, output_type.ID, pressure_range.ID, pressure_type.ID, series.ID, termination.ID FROM ( SELECT value AS cable_length FROM

我试图创建一个SQL语句,它接受八个不同的数字,并从一个数据库中搜索八个不同的表以获得相应的值。我不断得到无效的语法,但我不明白为什么。这是我的密码:

SELECT cable_length.ID, drawing.ID, optional.ID, output_type.ID, pressure_range.ID, pressure_type.ID, series.ID, termination.ID 
FROM
(
    SELECT value AS cable_length FROM A1 WHERE A1.id = %s
    JOIN SELECT value AS drawing FROM A2 WHERE A2.id = %s,
    JOIN SELECT value AS optional FROM A3 WHERE A3.id = %s,
    JOIN SELECT value AS output_type FROM A4 WHERE A4.id = %s,
    JOIN SELECT value AS pressure_range FROM A5 WHERE A5.id = %s,
    JOIN SELECT value AS pressure_type FROM A6 WHERE A6.id = %s,
    JOIN SELECT value AS series FROM A7 WHERE A7.id = %s, 
    JOIN SELECT value AS termination FROM A8 WHERE A8.id = %s
);

%s将仅更改为数字。每个表中的列名是“ID”和“Value”。我想按“ID”搜索并返回“Value”。表格名称为电缆长度等。非常感谢您的帮助

如果您知道所有8个值都存在,您可以这样加入:

SELECT  A1.value as cable_length
  , A2.value as drawing
  , A3.value as optional
  , A4.value as output_type
  , A5.value as pressure_range
  , A6.value as pressure_type
  , A7.value as series
  , A7.value as termination
FROM A1, A2, A3, A4, A5, A6, A7, A8
WHERE A1.ID = %s
  AND A2.ID = %s
  AND A3.ID = %s
  AND A4.ID = %s
  AND A5.ID = %s
  AND A6.ID = %s
  AND A7.ID = %s
  AND A8.ID = %s
如果您不知道这一点,但可以保证第一个值是存在的,那么您的查询必须变得更加丑陋,因为您需要左连接

SELECT  A1.value as cable_length
  , A2.value as drawing
  , A3.value as optional
  , A4.value as output_type
  , A5.value as pressure_range
  , A6.value as pressure_type
  , A7.value as series
  , A7.value as termination
FROM A1
  LEFT JOIN A2
    ON A2.ID = %s
  LEFT JOIN A3
    ON A3.ID = %s
  LEFT JOIN A4
    ON A4.ID = %s
  LEFT JOIN A5
    ON A5.ID = %s
  LEFT JOIN A6
    ON A6.ID = %s
  LEFT JOIN A7
    ON A7.ID = %s
  LEFT JOIN A8
    ON A8.ID = %s
WHERE A1.ID = %s
如果没有一个值是保证存在的,则hack将有一个子查询,它是一个由8个查询组成的
UNION ALL
,返回8个列,其中只有一个已填充,然后选择每个列的
MAX
作为该列名

这是一个可怕的技巧,我在过去使用过它来避免许多只偶尔连接的左连接出现性能问题


顺便提一下,8个名为A1..A8的表表明,您需要有数据库经验的人来检查您的设计,并为您提供更好的布局。

也许这就是您想要的。也许不是,我只是重写了你的问题:

SELECT
  cable_length.ID,
  drawing.ID,
  optional.ID,
  output_type.ID,
  pressure_range.ID,
  pressure_type.ID,
  series.ID,
  termination.ID 
FROM (SELECT ID FROM A1 WHERE A1.id = %s) AS cable_length
JOIN (SELECT ID FROM A2 WHERE A2.id = %s) AS drawing
JOIN (SELECT ID FROM A3 WHERE A3.id = %s) AS optional
JOIN (SELECT ID FROM A4 WHERE A4.id = %s) AS output_type
JOIN (SELECT ID FROM A5 WHERE A5.id = %s) AS pressure_range
JOIN (SELECT ID FROM A6 WHERE A6.id = %s) AS pressure_type
JOIN (SELECT ID FROM A7 WHERE A7.id = %s) AS series
JOIN (SELECT ID FROM A8 WHERE A8.id = %s) AS termination;

在这种情况下,UNION ALL将起作用,但它可能不是最好的解决方案,更不用说混乱了(参见@btilly提供的答案)。还要注意,这是SQL Server语法,可能与MySql略有不同

select max(cable_length), max(drawing), max(optional), max(output_type), max(pressure_range), max(pressure_type), max(series), max(termination)

from
(
    SELECT value as cable_length, null, null, null, null, null, null, null, null 
    FROM cable_length WHERE id = %s

    UNION ALL

    SELECT null, value as drawing, null, null, null, null, null, null, null 
    FROM drawing WHERE id = %s

    UNION ALL

    SELECT null, null, value as optional, null, null, null, null, null, null 
    FROM optional WHERE id = %s

    UNION ALL

    SELECT null, null, null, value as output_type, null, null, null, null, null 
    FROM output_type WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, value as pressure_range, null, null, null 
    FROM pressure_range WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, null, value as pressure_type, null, null 
    FROM pressure_type WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, null, null, value as series, null 
    FROM series WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, null, null, null, value as termination 
    FROM termination WHERE id = %s
);


您的流程不正确。那里的条件总是最终到来。请将连接语句括在()中,并在第一个表中使用on子句将它们连接起来。您在
SELECT
子句中列出了许多似乎不存在的列。请将这些连接的选项放在括号中,并为它们命名:
join(SELECT…,其中a.id=…)作为连接的表3
您没有
on
语法,表是如何连接的?我在原始查询中没有看到连接,可能他只想知道所有可能的组合:)当我尝试运行它时,我得到:表'labview\u test.A1'不存在您的八个表是什么?在最初的查询中,您使用了A1、A2、。。A8.我的八个表是电缆长度、图纸、可选、输出类型、压力范围、压力类型、系列、终端当我运行此程序时,它返回:表'labview\u test.A1'不存在使用实际表名而不是A1、A2等。我偏离了您的问题描述。这些表没有命名为A1..A8。这些表是同一数据库中的电缆长度等。每个表中的值都是“ID”和“Value”。b通常,当我将A1、A2等更改为表名时,我会得到:labview\u test。可选的\u Value'不会exist@user1486004然后编写optional.value甚至labview\u test.optional.value,而不是labview\u test.optional\u value。我给出的SQL的形式是正确的。您的架构我无法帮助您,因为我没有它可供参考。您无法
选择*
使用这种方法,您需要
选择max(电缆长度)作为电缆长度,max(绘图)作为绘图,
将其折叠回一行。@b如果ID是主键,则不需要,否则,是的,您可能是对的。我现在还不知道,因为我们不知道表的结构。如果ID是主键,那么最终会有8行,每个行有7个空值,而不是一行有所有8个值。这就是
max
hack的全部要点。@btilly-gotcha,在最终输出中。谢谢