从Tab1加入列名称,其中列值为Tab2

时间:2016-03-08 15:17:36

标签: php mysql sql

我有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,因此其值应为粗体。
所以我只需要使用"标记"进行适当的查询。在前端我然后将循环结果并寻找标志。如果设置了标志,则将值显示为粗体。

我对数据库结构没有任何影响。

3 个答案:

答案 0 :(得分:0)

假设表结构已完成且我们知道所有列名,我们可以执行以下查询来检查值是否存在。

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

由于您的设计受到限制,您无法单独使用MYSQL,但您可以借助PHP:

  1. 从tbl2

  2. 获取列名
  3. 使用这些列名称从tbl1

  4. 获取结果

    尝试以下操作(假设您使用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);
    }