MySQL连接表与虚拟列

彼德

我要创建虚拟列。listid主表中,我需要将虚拟列与“数据”连接起来。

Table: columns
+------+---------+-------------+
| [ID] | ID_USER |   DATENAME  |
+------+---------+-------------+
|   1  |   NULL  | Description |
+------+---------+-------------+
|   2  |   NULL  |     Cost    |
+------+---------+-------------+
|   3  |    2    |    Width    |
+------+---------+-------------+

Table: list
+----+-----------+------------+--------+
|[ID]|    NAME   |    DATE    |  COLOR |
+----+-----------+------------+--------+
|  1 |  234/2016 | 2016-06-06 |   red  |
+----+-----------+------------+--------+
|  2 | 1000/2016 | 2016-06-07 |  blue  |
+----+-----------+------------+--------+
|  3 | 3456/2016 | 2016-06-08 | yellow |
+----+-----------+------------+--------+


Table: data
+-----------+-----------+-------+
| ID_REPAIR | ID_COLUMN | VALUE |
+-----------+-----------+-------+
|     1     |     1     |  aaaa |
+-----------+-----------+-------+
|     1     |     2     |  10$  |
+-----------+-----------+-------+
|     2     |     1     |  bbbb |
+-----------+-----------+-------+
|     2     |     2     |  20$  |
+-----------+-----------+-------+
|     3     |     1     |  cccc |
+-----------+-----------+-------+
|     3     |     2     |  30$  |
+-----------+-----------+-------+


Result:
+------+-----------+------------+--------+-------------+------+
| [ID] |    NAME   |    DATE    |  COLOR | Description | Cost |
+------+-----------+------------+--------+-------------+------+
|   1  |  234/2016 | 2016-06-06 |   red  |     aaaa    |  10$ |
+------+-----------+------------+--------+-------------+------+
|   2  | 1000/2016 | 2016-06-07 |  blue  |     bbbb    |  20$ |
+------+-----------+------------+--------+-------------+------+
|   3  | 3456/2016 | 2016-06-08 | yellow |     cccc    |  30$ |
+------+-----------+------------+--------+-------------+------+

在此查询中,我得到名字columns

SELECT * FROM `columns` WHERE `id_user` IS NULL

并在PHP中将ID保存为变量,但是在测试中我只想生成仅包含第二列的表。在下面的代码中,我想使用Costcolumn生成结果,但始终是insert Descriptioncolumn:

SQL:

SELECT `list`.`id`, `name`, `date`, `color`, `data`.`value`
FROM `list` 
INNER JOIN `data` ON `list`.`id` = `data`.`id_repair` WHERE `repair_data`.`id_column` = 2

我不知道在id_column等于2的情况下如何仅进行内联接

spencer7593

SELECT所返回的列数不能在执行时动态确定。必须SELECT在查询列表中指定列数以及分配给每列的数据类型和名称(或别名)因此,让我们开始吧。

要使一条SQL语句返回如图所示的结果集,查询的形式必须是:

 SELECT l.id
      , l.name
      , l.date
      , l.color
      , (expr1)     AS `Description`
      , (expr2)     AS `Cost`
   FROM list l
    ... 

返回列。

至于表情expr1expr2你会使用返回DescriptionCost列,有一对夫妇的方法来展开实体属性值(EAV)模型回到规范的关系模型。

最容易理解但不一定是最佳选择的方法是在SELECT列表中使用相关的子查询。举个例子:

 SELECT l.id
      , l.name
      , l.date
      , l.color
      , ( SELECT d.value
            FROM `data` d
           WHERE d.id_repair = l.id
             AND d.id_column = 1
           ORDER BY d.value
           LIMIT 1
        )                      AS `Description`
      , ( SELECT c.value
            FROM `data` c
           WHERE c.id_repair = l.id
             AND c.id_column = 2
           ORDER BY c.value
           LIMIT 1
        )                      AS `Cost`
      , ( SELECT w.value
            FROM `data` w
           WHERE w.id_repair = l.id
             AND w.id_column = 3
           ORDER BY w.value
           LIMIT 1
        )                      AS `Width`
   FROM list l
  ORDER BY l.id

请注意,SELECT列表中的相关子查询最多只能返回一行,并且只返回一个表达式。也就是说,它返回一个值。


作为替代方案,我们可以利用外部联接操作和条件聚合。例如:

 SELECT l.id
      , l.name
      , l.date
      , l.color
      , MAX(IF(d.id_column=1,d.value,NULL)) AS `Description`
      , MAX(IF(d.id_column=2,d.value,NULL)) AS `Cost`
      , MAX(IF(d.id_column=3,d.value,NULL)) AS `Width`
   FROM list l
   LEFT
   JOIN data d
     ON d.id_repair = l.id 
  GROUP BY l.id, l.name, l.date, l.color

如果我们需要基于数据库中存储在表中的信息,使返回的结果具有动态性,具有不同数量的列以及用于这些列的表达式,那么我们可以首先从数据库中获取信息,然后将其用于帮助我们构造需要执行以获得最终结果的实际SQL语句。

或者,就像许多使用实体属性值(EAV)模型的应用程序一样,我们甚至没有尝试将EAV模型强制回到规范性关系模型中。我们只是让应用程序运行需要从表中检索信息的多个查询。基本上与应用程序如何在表中插入行相反。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL - 根据条件创建带有虚拟列的表

来自分类Dev

MySQL从多个表连接多个列

来自分类Dev

MySQL连接具有不同列的表

来自分类Dev

MySQL在表连接之间添加结果列

来自分类Dev

在 MySQL 中创建虚拟表

来自分类Dev

MySQL使用虚拟列作为连接点?

来自分类Dev

MYSQL连接同一表中的多个列

来自分类Dev

MySQL连接2张表并合并一列

来自分类Dev

mySQL更新列与另一个表的连接

来自分类Dev

MySQL LEFT JOIN Count列连接3个表

来自分类Dev

连接两个Mysql表以获取多个列的名称

来自分类Dev

MYSQL连接同一表中的多个列

来自分类Dev

使用mysql中不同表中的多列连接

来自分类Dev

如何基于mysql中的两列连接表?

来自分类Dev

MySQL表与Python连接

来自分类Dev

mysql连接表

来自分类Dev

在MySQL中连接表

来自分类Dev

MySQL表与Python连接

来自分类Dev

MySQL 表连接多值

来自分类Dev

MySQL虚拟列和通配符

来自分类Dev

mysql 如何通过两列连接并仅从连接表中获取最新记录?

来自分类Dev

DAX-虚拟表中的参考列

来自分类Dev

在 MySQL 中如何使用基于另一个表的列值的名称连接表?

来自分类Dev

PHP / MYSQL-仅在表中显示左连接项,但在列中连接右连接值

来自分类Dev

用mysql连接列

来自分类Dev

MySQL 列 json 与连接

来自分类Dev

MySQL,使用in子句连接表来连接

来自分类Dev

MySQL连接同时依靠连接表

来自分类Dev

连接4个MySQL表