不确定如何进行正确的mySQL查询,以便在一个查询中从多个表中获取数据
我需要从一个数据库的多个表中获取数据,我需要使用一个查询,但我无法让它工作 我拿到了这些桌子:不确定如何进行正确的mySQL查询,以便在一个查询中从多个表中获取数据,mysql,database,Mysql,Database,我需要从一个数据库的多个表中获取数据,我需要使用一个查询,但我无法让它工作 我拿到了这些桌子: 项目: 使用者 用户有一个项目 任务 所以我需要做的是做一个查询,它会给我这个结果: 结果: 我让它一直工作到我需要计算一个项目有多少任务的那一部分。 我得到了这个查询,但这不起作用: SELECT projects.id, projects.name, projects.start_date, projects.end_date, projects.finished, users.us
项目: 使用者 用户有一个项目 任务 所以我需要做的是做一个查询,它会给我这个结果:
结果: 我让它一直工作到我需要计算一个项目有多少任务的那一部分。 我得到了这个查询,但这不起作用:
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 */;
当将聚合函数i-e COUNT()与其他col一起使用时,必须使用group by子句。还有一件事,我还将查询模式化如下:; 当您想从GROUPBY子句中筛选某些内容时,请记住使用HAVING子句而不是WHERE子句
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
注意:请根据您的需要修改此查询,我认为这对您肯定有用。它给了我一个错误:#1054-未知列“user\u has\u project.userId”在“having子句”中“我没有键入cols name I-e”user\u has\u project.userId“检查我键入的所有cols name carefullySorry mate,但是这个不行。它给出了一个空的结果。我验证了查询,它应该是正确的,但是没有一些数据库来尝试它,我无法完全验证它。您能否为我们提供一个小的sql脚本来重新创建您的DB(结构和数据)的一小部分,并在其上尝试查询?鉴于您提供给我们的转储中的
tasks
表为空,空结果实际上是正确的。我在任务
表上使用左连接
修改了查询,因此如果查询为空,它应该仍然可以工作,请立即尝试@Dijkemark这是有效的。非常感谢你。我仍然需要提高我的mySQL技能。:)你能给我们提供一个SQL脚本,在我们自己的服务器上重新创建部分数据库(结构和数据)来测试查询吗?好的,我在我的主要帖子中添加了SQL转储。在你添加的转储中,tasks
表是空的,所以难怪你的查询(以及我的,基于你的查询)返回一个空结果集,事实上,这将是正确的结果。
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
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
-- 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 */;
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
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