【问题标题】:MySQL Join based on IFMySQL Join 基于 IF
【发布时间】:2011-12-19 20:07:24
【问题描述】:

这种情况涉及3张桌子。 项目 视频 说明

每个项目都有一个列“entitytype”和一个句柄“entityid”,它是表格视频或表格说明中一行的相应ID。不幸的是,这些表中的 id 名称分别是 urlid 和 textid。

我想选择一个项目,然后根据 'entitytype' 持有的值将视频中的一行或说明中的一行中的数据加入到选择中

这段代码是伪代码,我是 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

【问题讨论】:

    标签: php mysql join if-statement conditional


    【解决方案1】:

    只需连接两个表,然后使用 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_videoitems_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'
    

    【讨论】:

    • 如果我还是要尝试加入两个表,为什么还需要 IF?
    • 因为 IF 会自动填写返回给您的代码的值。要传输的数据更少。您可以在没有 if 的情况下工作,并返回两个值,并让您的代码使用它需要的那个 - 减少数据库的 CPU 使用率,发送更多数据。不能“每行只加入一个表”,在数据访问方面效率不高。
    • 啊,我明白了。很高兴知道。让我们看看这玩得好不好
    • 编辑了答案:删除了表格。*(通常是不好的样式:命名你的列)并删除了 IF 中 urlid 和 textid 周围的 ',因为我们谈论的是列,而不是字符串。
    • 所以我误解了 result_id 是什么。这确实会从相应的表中发回 id 字段的名称,但我可以从 items.entitytype 中推断出来。我真正想要的是只做一个 JOIN,并且 JOIN 基于 items.entitytype。这可能吗?
    【解决方案2】:

    如果您可以使用 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
    

    【讨论】:

    • 问题是我不知道在调用之前我将从两个表中选择哪一个,它基于 item.entitytype 中的值
    • 天啊!删除这个答案... Konerak 已经回答了这个问题
    • 如果你愿意,你可以自己删除答案,但它没有错误,所以没有真正需要
    猜你喜欢
    • 2012-01-28
    • 2010-11-25
    • 2017-12-22
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2017-03-03
    相关资源
    最近更新 更多