【问题标题】:Join column names from Tab1 with 1 column values of Tab2将 Tab1 中的列名与 Tab2 的 1 列值连接起来
【发布时间】:2016-03-08 15:17:36
【问题描述】:

我有 2 个具有以下结构的表:

// tab1:

| ID | Col1 | Col2 | Col3 | Col4 |
|----|------|------|------|------|
| 1  | Val1 | Val2 | Val3 | Val4 |
| 2  | Val5 | Val6 | Val7 | Val8 |

// tab2:

| Name |
|------|
| Col1 |
| Col3 |

我现在需要从tab1 获取所有值,并以某种方式将它们与tab2 列的值连接起来,以便在前端来自tab1 的所有列也存在于tab2 中,是粗体。

在伪代码中它看起来像这样:

SELECT Col1, COl2, Col3, Col4 FROM tab1, tab2 WHERE ID=1 AND {possibly a left join on tab2}

作为前端表格的所需输出可能是:

值 1:Val1
值 2:Val2
值 3:Val3
值 4:Val4

由于col1col3 也在tab2 中,所以它们的值应该是粗体。
所以我只需要带有“标志”的适当查询。然后在前端我将循环结果并查找标志。如果设置了标志,则将该值显示为粗体。

我对数据库结构并没有真正的影响。

【问题讨论】:

  • 两张表的连接条件是什么?
  • tab1 的表是否有固定数量的colN 列?我的意思是(col1、col2、col3 和 col4)?您如何将这两个表关联起来?
  • @DylanSu:没有实际的加入条件。它只应该检查来自tab1 的列是否也存在于tab2 中。
  • @1000111:不,没有固定的列宽。它们并不真正相关。
  • 以上tab2结构是否完整? tab2 只有一列?如果是,则您没有机会执行 JOIN。此外,如果 tab1 中的一行 was/is/will 被删除会怎样?

标签: php mysql sql


【解决方案1】:

假设表结构完整并且我们知道所有的列名,我们可以执行下面的查询来检查一个值是否存在。

select col1 as col1 , 
 (select count(*) from tab2 where name = 'col1') col1_exists,
 col2 as col2, 
 (select count(*) from tab2 where name = 'col2') col2_exists,
 col3 as col3 , 
 (select count(*) from tab2 where name = 'col1') col3_exists
 from tab1;

对于非零“存在”值,我们可以用粗体显示对应的列值。这是SQL Fiddle

【讨论】:

  • 谢谢。但是用户需要定义表,他想从中获取值。所以tab1 可以不同,我们不知道所有的列名。
  • 在这种情况下,我们可以将列名保留为“?”在实际查询中,然后根据表结构在运行时替换..
【解决方案2】:

试试这个:

SELECT 
t.`VALUE`,
(CASE WHEN tab2.Name IS NULL THEN 0 ELSE 1 END) flag
FROM 
(
    SELECT 
    Col1 AS `VALUE`,
    'Col1' AS colNum
    FROM tab1 
    WHERE ID = 1

    UNION 

    SELECT 
    Col2 AS `VALUE`,
    'Col2' AS colNum
    FROM tab1 
    WHERE ID = 1

    UNION 

    SELECT 
    Col3 AS `VALUE`,
    'Col3' AS colNum
    FROM tab1 
    WHERE ID = 1

    UNION 

    SELECT 
    Col4 AS `VALUE`,
    'Col4' AS colNum
    FROM tab1 
    WHERE ID = 1

) t
LEFT JOIN tab2 
ON tab2.`Name` = t.colNum;

SQL FIDDLE

【讨论】:

  • 谢谢。但是用户需要定义表,他想从中获取值。所以tab1 可以不同,我们不知道所有的列名。
  • 那么我肯定会说这是一个非常糟糕的设计,你甚至不知道列名!要么更改您的设计,要么为此付费。对不起,伙计。
【解决方案3】:

由于您的设计限制,您无法单独使用 MYSQL 完成此操作,但您可以借助 PHP:

  1. 从 tbl2 中获取列名

  2. 使用这些列名从 tbl1 获取结果

尝试以下操作(假设您使用mysqli):

//get columns from tbl2
$sql = 'SELECT * FROM tbl2';
$result = mysqli_query($conn, $sql);
$cols = [];
while ($row = mysqli_fetch_assoc($result)) {
    $cols[] = $row['name'];
}

//get results from tbl1 using column names
$sql = 'SELECT ' . implode(',', $cols) . ' FROM tbl1 WHERE ID=1';
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    var_dump($row);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多