【问题标题】:use of join sql commandjoin sql 命令的使用
【发布时间】:2015-02-07 12:10:41
【问题描述】:

我有两个表 - 小工具和用法。小工具具有唯一 ID 和相应的字段。而 Usage 则显示了 Gadgets 的旧 ID 值和新 ID 值之类的用法。

Gadgets TABLE
         ID  &  gadgetName

USAGE TABLE
     oldID & newID

现在我想用 input = gadgetName 在它们之间进行映射
就像让字段一样

 Gadgets 

 ID   gadgetName
 +++ ++++++++++++
 id1    nokia
 id2    motog
 id3    xiamoi
 id4    micromax

Usage 表是这样的

Usage Table

oldID   newID
+++++   ++++++
 id1     id2
 id2     id3
 id3     id4
 id2     id4

现在,输入为 micromax ,我想从 gadget 表中检索 gadgetName,该表存在于 oldID 中,newID 为 micromax。

就像 o/p 一样:

oldIDgadgetName
++++++++++++++++
xiamoi 
motog    

编辑:

我试过这个:

SELECT gadgets.gadgetName, gadgets.ID FROM usage, gadgets 
WHERE  usage.oldID IN ( 
   SELECT usage.oldID FROM usage , gadgets 
   WHERE usage.newID = gadgets.ID AND gadgets.gadgetName= ".$datawon."
 )" );

& 我没有得到想要的输出... . 我想在这里申请加入..请指导我。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    一种方法是加入 Gadget 表两次:

    select g2.gadgetName as oldIDgadgetName
    from Gadgets g1
    join Usage u on g1.ID = u.newID
    join Gadgets g2 on g2.ID = u.oldID
    where g1.gadgetName = 'micromax'
    

    根据您的示例数据,这将返回:

    oldIDgadgetName
    ---------------
    motog
    xiamoi
    

    这也可以完全不使用连接来编写(但它可能会执行得更糟),如下所示:

    select gadgetName 
    from Gadgets 
    where id in (
        select oldid 
        from Usage 
        where newID in (
           select id 
           from Gadgets 
           where gadgetName = 'micromax'
        )
    )
    

    【讨论】:

    • 谢谢...你能告诉我编辑中给出的查询中有什么问题
    • @SyamiliV 您的查询中有两个错误:gadgets.gadgets = ".$datawon." 应该是 gadgets.gadgetname = ".$datawon."(您可能也需要引用该变量,看起来您可能用 php 注入它?)而且您也错过了外部查询中的联接:最后是AND usage.newID = gadgets.ID
    • 谢谢,我刚刚更正了变量名...第二个是真的,它是我正在使用的 php 变量。不使用join可以处理这种情况吗..
    • @SyamiliV 是的,它可以在没有连接的情况下编写,我已经更新了答案以显示如何。
    • 我尝试了 sqllfiddle link 的查询。你能帮我看看这里有什么问题吗
    【解决方案2】:

    尝试使用连接并使用连接结果作为子查询来获取小工具名称,例如:

    SELECT gadgetName
    FROM Gadgets WHERE id in (
         SELECT u.oldId
         FROM Gadgets g INNER JOIN usage u 
         ON g.id = u.newId
         WHERE g.gadgetName = 'micromax')
    

    内部查询将返回 micromax 的旧 id,方法是在其他使用表中加入 newId 上的 id,然后使用您在 gadgets 表中查找的那些 oldId 作为名称。你甚至可以通过加入 Gadgets 表两次来做到这一点。

    【讨论】:

    • 谢谢..它有效,你能告诉我编辑中给出的查询中有什么问题
    • 在您的情况下,您所做的与我的内部子查询完全相同,但查看您的外部查询,您再次尝试加入不需要的小工具和使用情况,此外,您还没有提供连接条件也是如此,并且也不需要此连接。
    • 所以这个条件只能使用 join 来应用吗?我现在很好奇,如果有什么方法可以在不使用 join 的情况下获取数据。 (嘿,加入比使用多个查询更快吗?)
    • @SyamiliV 我在小提琴中看到的唯一问题是您必须在右侧窗口中运行查询:sqlfiddle.com/#!2/907987/1
    • @jpw 谢谢。是的,Syamili 请使用运行 SQL 按钮,您将在屏幕底部看到结果。
    猜你喜欢
    • 2021-03-25
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多