0

今天是个好日子,

我想问一个关于 SQL 的问题,我有 2 个表:

tuser (
  id_user,
  username,
  password,
  name,
  level
)
tstatus(
  id_status,
  id_user,
  status)

*tuser 有 5 行 tstatus 有 2 行

我正在做这个查询

SELECT * 
FROM tuser,tstatus 
WHERE tuser.id_user = tstatus.id_user 
  AND tuser.level = 'teacher' 
  AND tuser.name LIKE '%" . $queryString . "%' 
ORDER BY tuser.name 
LIMIT 5

mysql_fetch_array 的结果只返回 2 行用户数据。

这是因为 tstatus 表只有 2 行并且无法匹配任何 id_user 加入到 tuser 表中,这里的问题是动态填充 tstatus 字段可以填充或为空。

有人可以在不修改表结构的情况下帮我修复查询吗?

谢谢

4

4 回答 4

0

尽我所能理解你,我相信你正在寻找这样的东西:

SELECT
    *
FROM
    tuser
LEFT JOIN
    tstatus USING (id_user)
WHERE
    tuser.level = 'teacher'
AND
    tuser.name LIKE '%" . $queryString . "%'
ORDER BY
    tuser.name
LIMIT 5

这将选择所有具有“教师”级别和包含查询字符串的名称的用户——即使是那些没有相应状态的用户(任何tstatus字段的值都是NULL.

于 2012-11-28T17:24:29.717 回答
0

您可以进行左连接,以便所有 tuser 都在那里:

SELECT * FROM tuser left join tstatus on tuser.id_user = tstatus.id_user WHERE tuser.level = 'teacher' and tuser.name LIKE '%" . $queryString . "%' ORDER BY tuser.name LIMIT 5
于 2012-11-28T17:26:15.390 回答
0

使用左连接。USING 关键字将删除重复的 user_id 字段。

SELECT * 
FROM tuser tu
LEFT JOIN tstatus ts USING (user_id)
WHERE tu.level ='teacher'
AND tuser.name LIKE '%" . $queryString . "%' 
ORDER BY tuser.name 
LIMIT 5
于 2012-11-28T17:37:29.037 回答
0

改用左连接。

SELECT tu.*, ts.status FROM tuser tu
LEFT JOIN tstatus ts ON tu.id_user = ts.id_user
WHERE tu.level ='teacher'

您可以根据需要添加其他 where 语句

于 2012-11-28T17:28:38.150 回答