我试图构建一个超过3个表的查询并且我完全被难倒...我的知识限制是基本的1表查询,我需要一些帮助才能将我的头放在搅拌机中。
我有以下查询
SELECT * FROM internalrole WHERE introle = $imarole
我对那部分很好..它的下一个让我都感到压力。
该查询返回以下列(id,user_id,introle,proven,used)
我需要做的是从返回的结果中获取user_id并使用它来获取以下内容
SELECT * FROM users WHERE id = user_id(from previous query) AND archive = 0 and status = 8
我需要将其放入1个查询中,但等待,还有更多....从结果那里,我需要检查用户的'id'是否在可用性表中,如果是,请检查日期(列名是日期),如果它与今天的日期匹配,则不返回该用户。
我需要把所有这些都放在一个查询中:S ...我没有想法怎么做,想着它让我摇头......如果有人可以帮助我,我会非常感激。< / p>
干杯,
答案 0 :(得分:5)
使用INNER JOIN,它根据公共属性(通常是主要 - 外键关系)将表相互链接
说一个属性'id',链接table1和table2
SELECT t1.att1, t2.att2
FROM table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id --essentially, this links ids that are equal with each other together to make one large table row
要添加更多表,只需添加更多连接子句。
答案 1 :(得分:1)
SELECT u.*
FROM internalrole ir
INNER JOIN users u
ON ir.user_id = u.id
AND u.archive = 0
AND u.status = 8
LEFT JOIN availability a
ON ir.user_id = a.user_id
AND a.date = CURDATE()
WHERE ir.introle = $imarole
AND a.user_id IS NULL /* User does NOT exist in availability table w/ today's date */
编辑:第二个查询基于以下评论,要求仅在可用性表中显示做的用户。
SELECT u.*
FROM internalrole ir
INNER JOIN users u
ON ir.user_id = u.id
AND u.archive = 0
AND u.status = 8
INNER JOIN availability a
ON ir.user_id = a.user_id
WHERE ir.introle = $imarole
答案 2 :(得分:0)
SELECT * FROM users WHERE id IN (SELECT user_id FROM internalrole WHERE introle = $imarole) AND archive = 0 and status = 8;
让我记住的一个方便的事情是表格本质上是SQL中的数组。
HTH!
答案 3 :(得分:0)
嵌套查询是你的朋友。
SELECT * FROM users WHERE id in (SELECT user_id FROM internalrole WHERE introle = $imarole) AND archive = 0 and status = 8
或者加入:
SELECT * FROM users INNER JOIN internalrole ON users.id = internalrole.user_id WHERE internalrole.user_id = $imarole AND users.archive = 0 and users.status = 8