Php 基于IF的MySQL连接

Php 基于IF的MySQL连接,php,mysql,join,if-statement,conditional,Php,Mysql,Join,If Statement,Conditional,这种情况涉及3个表。 项目 录像带 指示 每个项都有一列“entitytype”和一个句柄“entityid”,后者是表视频或表说明中一行的对应id。不幸的是,这些表中id的名称分别是urlid和textid 我想选择一个项目,并根据“entitytype”的值将视频中的一行或说明中的一行中的数据加入到选择中 这段代码是psuedo,我是MySQL新手,试图找到一种方法来表达我的意图 到目前为止,我的直觉是: SELECT items.*, IF(entitytype='video',

这种情况涉及3个表。 项目 录像带 指示

每个项都有一列“entitytype”和一个句柄“entityid”,后者是表视频或表说明中一行的对应id。不幸的是,这些表中id的名称分别是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

只需对两个表进行联接,并使用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\u to\u视频和items\u to\u指令,它们在需要的地方建立链接

编辑:在床上躺了两分钟,不去想它之后,我想起来了。当然。
如果可以使用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";

如果我要尝试连接两个表,为什么需要IF?因为IF自动填充发送回代码的值。要传输的数据更少。您可以在不使用if的情况下工作,并发回两个值,让代码使用它所需要的值—减少数据库的CPU使用,发送更多数据。你不能为每一行,只连接一个表,这在数据访问方面是没有效率的。啊,我明白了。很高兴知道。让我们看看答案是否正确:删除表。*通常错误的样式:命名列并删除if中的“around urlid和textid”,因为我们讨论的是列,而不是字符串。所以我误解了结果是什么。这确实会从相应的表中返回id字段的名称,但我可以从items.entitytype中推断出来。我真正想做的是只进行一次联接,并基于items.entitytype进行联接。这可能吗?问题是我不知道在调用之前要从两个表中选择哪一个,它基于item.entitytypeOMG中的值!删除此答案。。。科内拉克已经回答了这个问题,如果你愿意,你可以自己删除这个答案,但这并没有错,所以没有必要这样做。
<?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