2016-03-08 4 views
1

У меня есть 2 таблицы со следующими структурами:Регистрация имен столбцов из Tab1 с 1 значений столбцов TAB2

// 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
Value 3: Val3
Значение 4: Val4

С col1 и col3 также находятся в tab2, их значения должны быть жирным.
Так что мне нужен только соответствующий запрос с флагом. В интерфейсе я тогда просто зацикливал результаты и искал флаг. Если флаг установлен, отобразите выделение полужирным шрифтом.

Я действительно не влияю на структуру базы данных.

+0

что состояние двух таблиц присоединиться? –

+0

Имеет ли 'tab1' табличное фиксированное число столбцов' colN'? Я имею в виду (col1, col2, col3 и col4)? И как вы связываете эти две таблицы? – 1000111

+0

@DylanSu: Нет фактического условия соединения. Он просто должен проверить, присутствуют ли столбцы из 'tab1' в' tab2'. – user1170330

ответ

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.

+0

Спасибо. Но пользователю нужно определить таблицу, он хочет получить значения. Так что 'tab1' может отличаться, и мы не знаем все имена столбцов. – user1170330

+0

В этом случае мы можем оставить имена столбцов как '?' в фактическом запросе, а затем заменить во время выполнения в зависимости от структуры таблицы. –

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

+0

Спасибо. Но пользователю нужно определить таблицу, он хочет получить значения. Так что 'tab1' может отличаться, и мы не знаем все имена столбцов. – user1170330

+0

Тогда я бы определенно сказал, что очень плохой дизайн, где вы даже не знаете названия столбцов! Либо измените свой дизайн, либо заплатите за него. Извините, что сказал чувак. – 1000111

0

Из-за ограничений с вашим дизайном, вы не в состоянии сделать это с 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); 
} 
Смежные вопросы