【问题标题】:MYSQL - How can disjoint columns be selected in a single query?MYSQL - 如何在单个查询中选择不相交的列?
【发布时间】:2010-07-01 06:42:30
【问题描述】:

我有 4 个表,每个表都有不同的列,但它们都有一个共同的列。这是一个整数标识符列。所以我将有一些整数 x,并且我想要所有 4 个表中的所有行,其中一个 id 列等于 x。

我试过类似的东西:

SELECT table1.col1, table2.col2 FROM table1 LEFT JOIN table2 ON table1.id=x OR coastlinessports.id=x

然后我得到了两个表中的两列都在同一行中的行。

所以一个结果块会有:

table1.col1, table2.col2

但我真的很想要:

table1.col1
tale2.col2

有没有一种方法可以在不连续执行 4 次选择查询的情况下做到这一点?

【问题讨论】:

  • 您能否发布每个表的结构(SHOW CREATE TABLE 的输出),并准确显示您希望从每个表中获得哪些列?

标签: mysql mysqli


【解决方案1】:

如果您希望来自不同表的连续行,并且每个表返回不同数量的行,那么您可以使用UNION。但是,UNION 要求每个 SELECT 返回相同数量的列,因此您需要使用值(或 NULL)填充缺失的列,如下所示:

DROP TABLE IF EXISTS `table1`;
DROP TABLE IF EXISTS `table2`;

CREATE TABLE `table1` (
  `id` int(11) NOT NULL auto_increment,
  `col1` VARCHAR(255),
  `col2` VARCHAR(255),
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

CREATE TABLE `table2` (
  `id` int(11) NOT NULL auto_increment,
  `col1` VARCHAR(255),
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

INSERT INTO `table1` VALUES
    (1, '1,1', '1,2'),
    (2, '2,1', '2,2');

INSERT INTO `table2` VALUES
    (1, '1,1'),
    (2, '2,1');

SELECT `id`, `col1`, `col2` FROM `table1` WHERE `id` = 1
UNION
SELECT `id`, `col1`, NULL AS `col2` FROM `table2` WHERE `id` = 1;

+----+------+------+
| id | col1 | col2 |
+----+------+------+
|  1 | 1,1  | 1,2  |
|  1 | 1,1  | NULL |
+----+------+------+

如果你想进一步处理UNION结果集,你可以把它包装在另一个SELECT中,像这样:

SELECT `col1`, `col2` FROM (
    SELECT `id`, `col1`, `col2` FROM `table1` WHERE `id` = 1
    UNION
    SELECT `id`, `col1`, NULL AS `col2` FROM `table2` WHERE `id` = 1
) AS `t1`
ORDER BY col2;

+------+------+
| col1 | col2 |
+------+------+
| 1,1  | NULL |
| 1,1  | 1,2  |
+------+------+

这就是你所追求的吗?

【讨论】:

    【解决方案2】:

    这可能无法回答您的问题,但 JOIN 有点奇怪。

    通常“ON”条件是指两个表都被连接,类似于:

    ... FROM table1 LEFT JOIN table2 ON table1.id = table2.id ...
    

    我想在某些情况下你不会这样做,但我想不出。

    【讨论】:

    • 作为评论更好 :-) 欢迎来到 SO。
    【解决方案3】:

    你应该看看这篇文章。这似乎是你所要求的: http://ask.sqlteam.com/questions/870/pivoting-multiple-rows-into-one-row-with-multiple-columns

    【讨论】:

      【解决方案4】:

      如果表名称相同,则可以使用 USING 而对于给定值的部分,使用 WHERE

      select * from table1 join table2 using(commonColumn) join table3 using(commonColumn) join table4 using(commonColumn) where commonColumn="desiredValue"
      

      更新:第二次阅读您的问题 你想要这个吗?

      table1 中 commonColumn="desiredValue" 的所有行
      其次是
      table2 的所有行,其中 commonColumn="desiredValue"
      其次是
      table3 的所有行,其中 commonColumn="desiredValue"
      其次是
      table4 的所有行 commonColumn="desiredValue"

      如果是这样,您需要使用 UNION(并且您必须进行 4 次选择) 如果列数不同,则需要使用别名填补空白

      SELECT col1, col2, col3, col4 from table1 where commonColumn="desiredValue"  
      UNION
      SELECT col1, col2, 0 as col3, 0 as col4 from table2 where commonColumn="desiredValue"  
      ...
      

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 2014-06-29
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多