0

データベースから複数のテーブルからデータを取得する必要があり、1つのクエリを使用する必要がありますが、それを機能させることができません。

私はこれらのテーブルを手に入れました:
プロジェクト:

id    name        start_date           end_date             project_leader    finished
1     project_1   2012-08-01 00:00:00  2012-29-01 00:00:00  2                 0

ユーザー

id    username    password    email      status
1     user_1      pass_1      email_1    1
2     user_2      pass_2      email_2    1

user_has_project

userid   projectId
1        1

タスク

id   project  description          end_date               user
1    1        test description 1   2012-29-01 00:00:00    1
2    1        test description 2   2012-29-01 00:00:00    1

だから私がする必要があるのは、私にこの結果を与えるはずのクエリを作成することです:
結果:

project_id  project_name    start_date           end_date             project_leader    finished       tasks
1           project_1       2012-08-01 00:00:00  2012-29-01 00:00:00  user_2            0              2  

プロジェクトのタスク数を数える必要がある部分まで、それを機能させることができました。私はこのクエリを受け取りましたが、それは機能しません:

SELECT projects.id, projects.name, projects.start_date, projects.end_date,
       projects.finished, users.username AS project_leader, COUNT(tasks.id) AS tasks
FROM projects, tasks
INNER JOIN user_has_project ON user_has_project.projectId = projects.id
INNER JOIN users ON projects.project_leader = users.id
WHERE user_has_project.userId = 1

SQLダンプ。これにより、ユーザーはクエリをテストしてみることができます。

-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Machine: localhost
-- Genereertijd: 20 aug 2012 om 19:42
-- Serverversie: 5.5.16
-- PHP-Versie: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `project-deadline`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `projects`
--

CREATE TABLE IF NOT EXISTS `projects` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `start_date` datetime DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `project_leader` int(11) DEFAULT NULL,
  `finished` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `projects`
--

INSERT INTO `projects` (`id`, `name`, `start_date`, `end_date`, `project_leader`, `finished`) VALUES
(1, 'Project 1', '2012-08-01 00:00:00', '2012-09-18 00:00:00', 1, 0);

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `tasks`
--

CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project` int(11) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  `end_date` datetime DEFAULT NULL,
  `user` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(100) NOT NULL,
  `status` int(11) NOT NULL,
  `timezone` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Gegevens worden uitgevoerd voor tabel `users`
--

INSERT INTO `users` (`id`, `username`, `password`, `email`, `status`, `timezone`) VALUES
(1, 'DijkeMark', '37540da17c71d40c656b97b32c00f692', 'mark.dijkema@gmail.com', 1, 'UP1');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `user_has_project`
--

CREATE TABLE IF NOT EXISTS `user_has_project` (
  `userId` int(11) NOT NULL,
  `projectId` int(11) NOT NULL,
  PRIMARY KEY (`userId`,`projectId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden uitgevoerd voor tabel `user_has_project`
--

INSERT INTO `user_has_project` (`userId`, `projectId`) VALUES
(1, 1),
(1, 6);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
4

2 に答える 2

1
SELECT projects.id,
        projects.name,
        projects.start_date,
        projects.end_date,
        projects.finished,
        users.username AS project_leader,
        COUNT(tasks.id) AS tasks
FROM projects
LEFT JOIN tasks ON (tasks.project = projects.id)
JOIN user_has_project ON (user_has_project.projectId = projects.id)
JOIN users ON (projects.project_leader = users.id)
WHERE user_has_project.userId = 1
GROUP BY projects.id
于 2012-08-19T13:00:56.870 に答える
0

集計関数、つまりCOUNT()を他の列で使用する場合は、groupby句を使用する必要があります。そしてもう1つ、クエリを次のようにモデレートしました。また、GROUP BY句から何かをフィルタリングする場合は、WHERE句の代わりにHAVING句を使用することを忘れないでください。

SELECT projects.id, projects.name, projects.start_date, projects.end_date,
       projects.finished, users.username AS project_leader, COUNT(tasks.id) AS tasks
FROM projects 
INNER JOIN user_has_project ON user_has_project.projectId = projects.id
INNER JOIN users ON user_has_project.userid = users.id
INNER JOIN tasks ON users.id = task.user
GROUP BY projects.id, projects.name, projects.start_date, projects.end_date, 
         projects.finished, project_leader
HAVing user_has_project.userid = 1

注:必要に応じてこのクエリを変更してください。これは間違いなく機能すると思います。

于 2012-08-19T10:51:18.537 に答える