1

私は次の機能を持っています

function availableChatRoom($topic_id){
$max_rooms = 2;
$max_users = 2;

$sqli = "SELECT COUNT(DISTINCT room_num) AS numRooms FROM forum_chat WHERE topic_id = '$topic_id'";
$num_rooms = queryColumnVal($sqli, "numRooms");

$sqlii = "SELECT room_num, COUNT(user_id) AS numUsers FROM forum_chat 
          WHERE topic_id = '$topic_id' AND (status = 'online' AND status = 'offline') AND chat_msg = ''
          GROUP BY room_num
          HAVING numUsers < $max_users ORDER BY msg_date";

$num_rooms_with_spaces = mysqlNumRows($sqlii, "room_num");
queryColumnVal($sqlii, "room_num");

if($num_rooms == 0){
    return 1;
}
elseif($num_rooms <= $max_rooms){

    if($num_rooms_with_spaces == 0){
        return $num_rooms + 1;
    }
    else{
        return queryColumnVal($sqlii, "room_num");
    }
}
else{
    return "none";
}   

}

アイデアは、関数がスペース付きのチャット ルーム番号を返すことです。-ユーザーがルームに参加するたびに、オンラインのステータスでメッセージのない行が挿入されます -ユーザーが部屋を出るたびに、オフラインのステータスでメッセージのない行が挿入されます各トピックの任意の予備の部屋 ログインしているがログアウトしていないユーザーの数が、部屋ごとの最大チャット数よりも少ない room_num を選択するという考え方です。誰かが私の $sqlii を手伝ってくれませんか?

ありがとう

4

3 に答える 3

3

HAVING clauseSELECT の前に評価されるため、サーバーはそのエイリアスについてまだ認識していません。

SELECT room_num, COUNT(user_id) AS numUsers 
FROM forum_chat 
WHERE topic_id = '$topic_id' AND 
      (status = 'online' OR status = 'offline') AND 
      chat_msg = ''
GROUP BY room_num
HAVING COUNT(user_id) < $max_users ORDER BY msg_date
  1. まず、 内のすべてのテーブルの積from clauseが形成されます。
  2. 次にwhere clauseが評価され、search_condition を満たさない行が除外されます。
  3. 次に、 の列を使用して行をグループ化しますgroup by clause
  4. 次に、検索条件を満たさないグループをhaving clause除外します。
  5. 次に、select clauseターゲット リスト内の式が評価されます。
  6. 選択句にdistinctキーワードが存在する場合、重複する行が削除されるようになりました。
  7. 各副選択が評価された後に共用体が取得されます。8.最後に、結果の行は、order by 句で指定された列に従って並べ替えられます。
于 2012-05-25T11:32:47.607 に答える
1

クエリにいくつかのエラーがあります:

  • (status = 'online' AND status = 'offline')

これは、クエリが no を返すことをアサートします。用途:(status = 'online' OR status = 'offline')または同等のもの(status IN ('online', 'offline'))

  • COUNT(user_id)

これは、オンライン ユーザーとオフライン ユーザーの差をカウントしません。ロジックを修正します。

  • ORDER BY msg_date

クエリでは、MySQL で許可されているにもかかわらず、 、または句GROUP BYで非集計列を使用するのは良くありません。その列がグループ化式に依存しない限り。は明らかに に依存しないため、それを集約関数に置き換える必要があります。HAVINGSELECTORDER BYmsg_dateroom_num

ORDER BY MAX(msg_date) また ORDER BY MIN(msg_date)


$sqlii = "
   SELECT room_num, 
          COUNT(CASE WHEN status = 'online' THEN 1 END) 
            - COUNT(CASE WHEN status = 'offline' THEN 1 END) 
          AS numUsers 
   FROM forum_chat 
   WHERE topic_id = '$topic_id' 
     AND status IN ('online', 'offline')
     AND chat_msg = ''
   GROUP BY room_num
   HAVING COUNT(CASE WHEN status = 'online' THEN 1 END) 
          - COUNT(CASE WHEN status = 'offline' THEN 1 END) 
          < $max_users 
   ORDER BY MAX(msg_date)
     ";
于 2012-05-25T11:31:42.733 に答える
0

HAVING同じSELECTレベルで列のエイリアスを使用することはできません。これは、MySQLONLY_FULL_GROUP_BYがアクティブになるためです。

これを試して -

HAVING COUNT(user_id) < $max_users ORDER BY msg_date
于 2012-05-25T11:19:16.493 に答える