在单个表上使用Sql Join两次

时间:2015-06-30 23:21:58

标签: mysql sql join

这是我在3嵌套表单中的查询。我想要的是使用JOINS重写这个查询,但问题是同一个表重复两次,你可以看到。

$query = "
    SELECT
        *
    FROM userinfo
    WHERE id IN (
        SELECT DISTINCT
            iduser
        FROM u_n_relation
        WHERE idnetwork IN (
            SELECT
                idnetwork
            FROM u_n_relation
            WHERE iduser = '$userid'
        )
    )
    AND virtual_name LIKE CONCAT('%', ?, '%')
    ORDER BY id LIMIT 5
"

我试过的是:

$query = "
    SELECT
        userinfo.*
    FROM userinfo
    INNER JOIN u_n_relation ON (u_n_relation.iduser = userinfo.id)
    WHERE 
        (userinfo.virtual_name LIKE CONCAT('%', ?, '%')
        AND u_n_relation.iduser = '$iduser')
    ORDER BY userinfo.id LIMIT 5
"

但仍然没有得到正确的结果。 任何人都可以说明如何做到这一点?

基本上查询的内容是: 获取已加入您加入的网络的用户的详细信息。

2 个答案:

答案 0 :(得分:1)

使用select distinct时不需要

in。但是,使用join时可能需要它。否则,您可以将in转换为内部联接:

SELECT ui.*
FROM userinfo ui JOIN
     (SELECT DISTINCT unr.iduser
      FROM u_n_relation unr JOIN
           u_n_relation unr2
           ON unr.idnetwork = unr2.idnetwork and
              unr2.iduser = '$userid'
      WHERE unr.virtual_name LIKE CONCAT('%', ?, '%') 
     ) unr 
     ON ui.id = unr.iduser
ORDER BY id
LIMIT 5;

答案 1 :(得分:-1)

首先,Mark L.是正确的,因为别名是在查询中多次连接同一个表的关键。

其次,圣洁的废话格式。发布查询以询问有关它的问题时,格式化尤其重要。您的格式化导致Gordon L.错误地读取了哪个表格" virtual_name"田野在。

最初你的第一个查询对我没有意义,但是jackkorbins评论让我再次查看它并且我这次得到它 - 这里的格式更加简洁:

SELECT * 
FROM 
   userinfo 
WHERE 
   id IN (-- This sub-query returns *any* iduser that is a member
          -- of those same networks
          SELECT DISTINCT 
             iduser 
          FROM 
             u_n_relation 
          WHERE 
             idnetwork IN (-- This sub-query returns the multiple networks
                           -- that have $userid as a member
                           SELECT 
                              idnetwork 
                           FROM 
                              u_n_relation 
                           WHERE 
                              iduser = '$userid')) 

   AND virtual_name LIKE CONCAT('%', ?, '%') 
ORDER BY 
   id 
LIMIT 5

另一种制作该查询的JOIN版本的方法如下:

SELECT DISTINCT
   ui.*
FROM 
   u_n_relation unr

   INNER JOIN u_n_relation net
      ON (net.idnetwork=unr.idnetwork) 

   INNER JOIN userinfo ui
      on ( ui.id = net.iduser )

WHERE 
   unr.iduser = '$iduser'

   and ui.virtual_name LIKE CONCAT('%', ?, '%') 
ORDER BY 
   ui.id 
LIMIT 5

对不起我之前的困惑。 : - )