2014-10-01 3 views
0

У меня есть таблица comments ->Выбор из различных таблиц на основе условия

id | comment | type | userid | 
1 Hello  human 9 
2 Hi  robot 4 
3 Gnaw!  animal 1 
4 Boo  ghost 2 

Также у меня есть еще четыре таблицы human, robot, ghost и animal Эти таблицы содержат некоторые основные сведения о себе ...

Теперь я ценность ноу комментария сказать: $ ID = 3 если я сделать

$data = mysqli_query($con,"SELECT type FROM comments WHERE id = $id"); 
while($row = mysqli_fetch_assoc($data)){ 
     $table = $row['type'];   
     $table_data = mysqli_fetch_assoc(mysqli_query($con,"SELECT * FROM $table")); 
} 

это даст мне все данные о том, кто прокомментировал, но это окажется слишком медленным .... есть ли способ, который я могу объединить в один запрос?

ответ

1

Один из способов сделать это с помощью левого соединения.

SELECT c.type, COALESCE(h.detail,r.detail,a.detail,g.detail) 
FROM comments 
LEFT JOIN human h ON c.type = 'human' AND c.id = h.id 
LEFT JOIN robot r ON c.type = 'robot' AND c.id = r.id 
LEFT JOIN animal a ON c.type = 'animal' AND c.id = a.id 
LEFT JOIN ghost g ON c.type = 'ghost' AND c.id = g.id 

Другой способ сделать UNION на четырех столах, а затем присоединиться к тем:

SELECT c.type, q1.detail 
FROM comments c 
LEFT JOIN 
(
    SELECT 'human' AS type, detail FROM human 
    UNION 
    SELECT 'robot', detail FROM robot 
    (etc.) 
) q1 ON c.type = q1.type AND q1.id = c.id 

Я бы предпочел второй вариант, потому что это один делает его легче присоединиться много detail- колонны. Я не думаю, что есть большая разница в производительности.

+0

COALESCE .......? –

+0

COALESCE возвращает первое не пустое значение, делая левое JOIN, вы «забираете» все, но вы видите только не пустое, умное решение :) – peterpeterson

+0

, что было бы лучше? –

Смежные вопросы