这是我在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
"
但仍然没有得到正确的结果。 任何人都可以说明如何做到这一点?
基本上查询的内容是: 获取已加入您加入的网络的用户的详细信息。
答案 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
对不起我之前的困惑。 : - )