0

PHP と MySQL を使用してカスタム フォーラムを開発しています。このシナリオには、ボード、スレッド、およびメッセージの 3 つの主要なテーブルがあります。ボード内のメッセージの数を数えたいと思います。スレッド テーブルには、そのスレッドの最初のメッセージへの参照である「first_msg_id」という列があります。私のクエリは、このメッセージをカウントすべきではありません。

CREATE TABLE IF NOT EXISTS `forum_messages` (
  `message_id` int(15) NOT NULL AUTO_INCREMENT,
  `thread_id` int(15) NOT NULL,
  `author_id` int(15) NOT NULL,
  `modifier_id` int(15) DEFAULT NULL,
  `content` テキスト NOT NULL,
  `date_posted` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `date_modified` タイムスタンプ NULL DEFAULT NULL,
  主キー (`message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `forum_threads` (
  `thread_id` int(15) NOT NULL AUTO_INCREMENT,
  `board_id` int(15) NOT NULL,
  `first_msg_id` int(15) NOT NULL,
  `last_msg_id` int(15) NOT NULL,
  `author_id` int(15) NOT NULL,
  `updater_id` int(15) NOT NULL,
  `title` テキスト NOT NULL,
  `date_posted` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `date_updated` タイムスタンプ NOT NULL DEFAULT '0000-00-00 00:00:00',
  `views` int(15) NOT NULL,
  `status` tinyint(1) NOT NULL,
  `type` tinyint(1) NOT NULL COMMENT '0 通常、1 スティッキー、2 グローバル。',
  主キー (`thread_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `forum_boards` (
  `board_id` int(15) NOT NULL AUTO_INCREMENT,
  `parent_id` int(15) NOT NULL,
  `category_id` int(15) NOT NULL,
  `last_msg_id` int(15) NOT NULL,
  `position` tinyint(1) NOT NULL,
  `title` テキスト NOT NULL,
  `description` テキスト NOT NULL,
  `status` tinyint(1) NOT NULL,
  `thread_count` int(15) NOT NULL,
  `reply_count` int(15) NOT NULL,
  主キー (`board_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

これは私が持っているクエリです:

$query_board_replies = "
                    選択する
                        m.message_id、m.thread_id、
                        t.thread_id、t.first_msg_id、t.board_id
                    FROM forum_messages AS m
                    LEFT JOIN forum_threads AS t ON t.first_msg_id != m.message_id
                    WHERE t.board_id = ".$board_id."
                    ORDER BY m.message_id";

エラーは返されませんが、完全に間違ったカウントが返されます。実際の応答は 2 つしかありませんが、特定のボードで 18 のカウントを返しています。

何か案は?

4

1 に答える 1

0

これでうまくいくはずです。

$query = "
  SELECT
    COUNT(*)
  FROM
    forum_messages A,
    forum_threads  B
  WHERE
    A.thread_id   = B.thread_id    AND
    A.message_id != B.first_msg_id AND
    B.board_id    = " . mysqli_real_escape_string($dbc, $board_id) . "
";
$rs = mysqli_query($dbc, $query);
list($count) = mysqli_fetch_array($rs);
echo $count;
于 2013-07-15T17:35:44.323 に答える