从多个mysql表获取数据WHERE。

时间:2018-02-08 12:04:50

标签: php mysql

我有2个数据库表。

一个叫文件。看起来像这样。

文件

USERID FILENAME DEFAULT NETWORKID
88      hello      1      10293
9       bob               
43      opener     1      10293
43      facepa            
9       closer           

第二个表用户网络

USERID NETWORKID 
9       10293
43

我当前的SQL查询是

SELECT file,filename,filetype,size, forename, files.userID
FROM (`files`)
LEFT JOIN users ON users.userID = files.userID
WHERE files.userID = $userID ORDER BY id DESC

目前获取userid为9的文件列表。

正如您所看到的,我的用户标识9也在usernetworks表中,我与网络ID 10293连接。

我还希望在查询中包含任何默认为1的行,并且网络ID与usernetworks表中的任何行匹配我的userID。

因此,当userid连接到networkid时,也会显示那些结果以及具有userid且没有网络ID的结果。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:3)

如果我正确地阅读了您的逻辑,那么我们可以通过在用户与您的用户ID匹配的条件下首先将files加入users来实现它。然后,我们可以再次加入users,这次是文件记录是默认的,网络ID匹配,匹配的用户也是你的用户。

SELECT f.*
FROM files f
LEFT JOIN users u1
    ON f.userID = u1.userID AND f.userID = $userID
LEFT JOIN usernetworks u2
    ON f.default = 1 AND
       f.networkid = u2.networkid AND u2.userID = $userID
WHERE
    u1.userID IS NOT NULL OR u2.userID IS NOT NULL;

实际上,如果您不打算从users表中选择任何列,那么您可以完全省略该表的连接。我已将其保留,因为您的问题中的原始查询是正确的。

答案 1 :(得分:1)

我知道您希望自己的文件加上网络中的默认文件:

SELECT userid, filename, networkid 
FROM files
WHERE (userid = $userid 
OR (default = 1 AND networkid in (
   select networkid from network_users where userid = $userid)))
AND filename like :name

您的SQL提及不在架构描述中的字段。

答案 2 :(得分:0)

如果您想根据网络ID获取数据,请使用此查询

SELECT file,filename,filetype,size, forename, files.userID
FROM files a, network b
WHERE a.networkID = b.networkID ORDER BY id DESC

。 希望这能解决你的问题