MySQL Join на основе IF - PullRequest
2 голосов
/ 02 ноября 2011

Эта ситуация включает в себя 3 таблицы.инструкции видео элементов

Каждый элемент имеет столбец entitytype и дескриптор entityid, который является соответствующим идентификатором строки в виде таблицы или инструкции таблицы.К сожалению, имена идентификаторов в этих таблицах соответственно urlid и textid.

Я хотел бы выбрать элемент и объединить данные из строки в видео или из строки в инструкциях по выбору в зависимости от того, какое значение имеет «entitytype»

Этот код psuedoЯ новичок в MySQL и пытаюсь найти способ передать мои намерения

Вот моя интуиция:

SELECT items.*, 
    IF(entitytype='video', 'videos', 'instructions') as detail_table,
    IF(entitytype='video', 'urlid', 'textid') as detail_id
FROM items
    JOIN (detail_table) ON (items.entityid=detail_table.detail_id)
WHERE itemid=something

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Просто объедините обе таблицы и выберите нужное значение, используя IF.

SELECT items.yourcolumns,
    IF(items.entitytype='video', urlid, textid) as result_id
FROM items
    LEFT OUTER JOIN videos ON items.entityid=videos.urlid
    LEFT OUTER JOIN instructions ON items.entityid=instructions.textid
WHERE itemid=something

Ваша реляционная модель нарушается, если ссылка столбца указывает на другую таблицу на основе значения другого столбца.

Лучше: есть две дополнительные таблицы: items_to_video и items_to_instructions, которые создают ссылку, где это необходимо

Правка: после двух минут лежания в постели и не думая об этом, я подумал оЭто.Конечно.

 SELECT items.yourcolumns,
     urlid as result_id
 FROM items
     JOIN videos ON items.entityid=videos.urlid
 WHERE itemid=something AND items.entitytype='video'
UNION ALL
 SELECT items.yourcolumns,
     textid as result_id
 FROM items
     JOIN instructions ON items.entityid=instructions.textid
 WHERE itemid=something AND items.entitytype<>'video'
0 голосов
/ 02 ноября 2011

Если вы можете показать запрос динамически с помощью PHP, я думаю, что он может даже повысить производительность.Это было бы что-то вроде:

<?php
$detail_table = 'detail_table';
$detail_id = 'detail_id';

$sql = "SELECT items.*, 
    {$detail_table},
    {$detail_id}
FROM items
    JOIN {$detail_table} ON (items.entityid={$detail_table}.{$detail_id})
WHERE itemid=something";

Кстати, вы можете добавить объединения с обеих таблиц:

SELECT
    items.*,
    instructions.*,
    videos.*
FROM
    items
    LEFT JOIN videos ON (items.entityid=videos.detail_id)
    LEFT JOIN instructions ON (items.entityid=instructions.detail_id)
WHERE
    itemid=something
...