0

MySQLクエリに問題があります。結果のGROUP_CONCAT配列の最初の項目の結果のみを返します。つまり、結果の配列は[1,3,4]であり、ユーザーID1のみの質問が返されます。

$query_search = "SELECT questionnaires_index.id, questionnaires_index.ea_num, questionnaires_index.address, questionnaires_index.status, questionnaires_index.json_stored, users.username FROM questionnaires_index INNER JOIN users ON users.id = questionnaires_index.interviewer_id WHERE questionnaires_index.interviewer_id IN (SELECT GROUP_CONCAT(id) FROM users WHERE supervisor = (SELECT id FROM users WHERE username = '".$username."'))";

GROUP_CONCATを間違って使用していますか?これを行うためのより良い方法はありますか?

編集1 このクエリで使用されるSQLテーブルは次のとおりです

CREATE TABLE IF NOT EXISTS `questionnaires_index` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ea_num` int(10) unsigned NOT NULL,
  `address` varchar(100) NOT NULL,
  `interviewer_id` int(10) unsigned NOT NULL,
  `status` varchar(30) NOT NULL DEFAULT 'Available',
  `json_stored` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `questionnaires_index`
--

INSERT INTO `questionnaires_index` (`id`, `ea_num`, `address`, `interviewer_id`, `status`, `json_stored`) VALUES
(1, 101, '29 De Havilland Crescent Pro Park, Building 1 Persequor Technopark Pretoria 0020', 1, 'Non Contact', 1),
(2, 102, '5th Floor, Imperial Bank Terraces Carl Cronje Drive Tyger Waterfront Bellville 7530', 1, 'Available', 0),
(3, 101, '29 De Havilland Crescent Pro Park, Building 1 Persequor Technopark Pretoria 0020', 3, 'Partially Completed', 0),
(4, 102, '5th Floor, Imperial Bank Terraces Carl Cronje Drive Tyger Waterfront Bellville 7530', 3, 'Available', 0),
(5, 201, '101 test address', 4, 'Available', 0);

そしてユーザーのために:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  `supervisor` int(10) unsigned NOT NULL,
  `version_code` varchar(10) NOT NULL,
  `is_interviewer` tinyint(1) NOT NULL DEFAULT '0',
  `is_supervisor` tinyint(1) NOT NULL DEFAULT '0',
  `surname` varchar(50) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `username`, `password`, `supervisor`, `version_code`, `is_interviewer`, `is_supervisor`, `surname`) VALUES
(1, 'Rynardt', 'q', 2, '2.2.0', 1, 0, ''),
(2, 'Herholdt', 'q', 0, '2.2.0', 0, 1, ''),
(3, 'test', 'test', 2, '2.2.0', 1, 0, ''),
(4, 'Botha', 'q', 2, '', 1, 0, '');

編集2 私がやろうとしていることに関する詳細情報:

私が作成した編集を見ると、SQLテーブルが含まれていることがわかります。u.supervisorは、usersテーブルのスーパーバイザエントリのIDを示すopタイプの整数です。$ usernameは文字列型で、スーパーバイザーの名前を示します。したがって、最初にスーパーバイザーのIDを取得してから、以前に見つかったIDのスーパーバイザーを持つユーザーのすべてのIDを取得する必要があります。次に、このusers.idの配列を使用して、これらのユーザーに関連付けられているすべての質問票を取得し、スーパーバイザーがログインしたときにそれを表示します。

4

2 に答える 2

0

まず、ここでGROUP_CONCAT(ID)を完全にスキップして、interviewer_id IN(SELECT ID FROM users [...])を使用することができます。

編集:投稿をテーブルで更新したので、そうです-その場合、おそらくそのサブクエリが必要になります。追加のクエリでスーパーバイザーのIDを抽出し、ここでネストされたSQLをスキップすることもできます。または、スーパーバイザーがログインし、取得したデータを確認する必要があると言ったので...おそらくユーザーIDをセッションに保存し(そこから来ていると思いますか?)、サブクエリと追加のクエリを追加するだけで完全にスキップしますログインスクリプトへのuser-idは、セッション変数を作成します。

ちなみに、少なくともmd5またはshaでパスワードをハッシュする必要があります。ユーザーが登録した時間を節約し、タイムスタンプと定数を使用してパスワードをハッシュしてテーブルに保存する前に、パスワードをソルトすることをお勧めします。

于 2012-07-30T15:12:23.320 に答える
0
SELECT GROUP_CONCAT(id) FROM users WHERE supervisor = 
   (SELECT id FROM users WHERE username = '".$username."') 
GROUP BY supervisor

のような集計関数を使用group_concatするには、集計結果セットが必要です;)

編集...うーん...この特別な場合

 WHERE ... IN (SELECT id FROM ...)

十分である必要があり、結果セットを連結する必要はありません

于 2012-07-30T15:11:57.017 に答える