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 つの行しかなく、tuser テーブルに結合する id_user と一致しなかったためです。ここでの問題は、tstatus フィールドを動的に埋めることです。

テーブル構造を変更せずにクエリを修正するのを手伝ってくれる人はいますか?

ありがとう

4

4 に答える 4

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
    *
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

代わりに左結合を使用してください。

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 に答える