使用SQL连接3+表显示太多结果

时间:2013-07-24 01:55:50

标签: mysql sql sql-server foreign-key-relationship multiple-tables

我试图创建一个查询,使用下面的方法将这些表连接在一起。但是它重复结果并且它们没有正确连接。如同相同的评级评论将是关于大约4/5不同的结果等。当我期待3时,它会产生18个结果吗会有人愿意帮我解决这个问题吗?

SELECT a.Company_name, 
       f.Job_ID, 
       f.Job_Name, 
       b.User_Name, 
       c.Comments, 
       c.Reliability, 
       c.Rating
FROM company a, 
     Users b, 
     Ratings c, 
     UserCompJobRating d,
     Company_Job e, 
     Jobs f
WHERE d.Comp_job_ID = e.Comp_Job_ID
     AND b.users_ID = d.users_ID
     AND c.Rating_ID = d.Rating_ID;

非常感谢,

安德鲁

好吧,我试过这个,并且说e.Users_ID是'on clause'中未知的列

SELECT a.Company_name, 
   b.Job_ID, 
   b.Job_Name, 
   c.User_Name, 
   d.Comments, 
   d.Reliability, 
   d.Rating
FROM Company a, UserCompJobRating e, Jobs b
INNER JOIN Users c
   ON c.Users_ID = e.Users_ID
inner join Company_Job f
    on e.Comp_Job_ID = f.Comp_Job_ID
inner join Ratings d
    on d.Rating_ID = e.Rating_ID;

我假设我很接近,但同时离开了?

我试着给你一些更多的信息:

UserCompJobRating有一个主键UCJR_ID和3个外键Comp_Job_ID,Users_ID和Rating_ID

Company_Job表作为主键Comp_Job_ID,以及2个外键Job_ID,Company_ID

评级表只有Rating_ID作为主键,其余只与评级信息有关

用户表具有Users_ID作为主键和基本用户信息地址等

作业表有一个Job_ID主键和有关作业的基本信息,例如名称,价格等。

公司表将Company_ID作为主键和基本公司信息,类似于Users表。

以下是定义:

CREATE TABLE `company` (
  `Company_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Company_Name` varchar(45) NOT NULL,
  `CAddress` varchar(45) NOT NULL,
  `CTown` varchar(45) NOT NULL,
  `CPostcode` varchar(12) NOT NULL,
  `CTelephone` varchar(45) NOT NULL,
  PRIMARY KEY (`Company_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

CREATE TABLE `company_job` (
  `Comp_Job_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Company_ID` int(11) NOT NULL,
  `Job_ID` int(11) NOT NULL,
  PRIMARY KEY (`Comp_Job_ID`),
  KEY `Company_ID_idx` (`Company_ID`),
  KEY `Job_ID_idx` (`Job_ID`),
  CONSTRAINT `Company_ID` FOREIGN KEY (`Company_ID`) REFERENCES `company` (`Company_ID`) ON DELETE NO ACTION ON         UPDATE NO ACTION,
  CONSTRAINT `Job_ID` FOREIGN KEY (`Job_ID`) REFERENCES `jobs` (`Job_ID`) ON DELETE NO ACTION ON UPDATE NO     ACTION

CREATE TABLE `jobs` (
  `Job_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Job_Name` varchar(45) NOT NULL,
  `Job_Cost` varchar(45) DEFAULT NULL,
  `Job_Avg_Time` varchar(45) DEFAULT NULL,
  `Job_Avg_Cost` varchar(45) DEFAULT NULL,
  `Job_Description` varchar(45) NOT NULL,
  `Company_ID` int(11) NOT NULL,
  PRIMARY KEY (`Job_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `ratings` (
  `Rating_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Comments` varchar(200) DEFAULT NULL,
  `Cost` varchar(45) DEFAULT NULL,
  `Reliability` varchar(45) DEFAULT NULL,
  `Rating` int(11) DEFAULT NULL,
  PRIMARY KEY (`Rating_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `usercompjobrating` (
  `UCJR_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Comp_Job_ID` int(11) DEFAULT NULL,
  `Rating_ID` int(11) DEFAULT NULL,
  `Users_ID` int(11) DEFAULT NULL,
  PRIMARY KEY (`UCJR_ID`),
  KEY `Comp_Job_ID_idx` (`Comp_Job_ID`),
  KEY `Rating_ID_idx` (`Rating_ID`),
  KEY `User_ID_idx` (`Users_ID`),
  CONSTRAINT `Comp_Job_ID` FOREIGN KEY (`Comp_Job_ID`) REFERENCES `company_job` (`Comp_Job_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `Rating_ID` FOREIGN KEY (`Rating_ID`) REFERENCES `ratings` (`Rating_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `Users_ID` FOREIGN KEY (`Users_ID`) REFERENCES `users` (`Users_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `users` (
  `Users_id` int(11) NOT NULL AUTO_INCREMENT,
  `User_Name` varchar(45) NOT NULL,
  `UAddress` varchar(45) NOT NULL,
  `UTown` varchar(45) NOT NULL,
  `UPostcode` varchar(45) NOT NULL,
  `UTelephone` varchar(45) NOT NULL,
  `UDOB` varchar(45) NOT NULL,
  PRIMARY KEY (`Users_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

2 个答案:

答案 0 :(得分:1)

查询需要看起来像这样,即使用此表单

SELECT a.Company_name, 
   f.Job_ID, 
   f.Job_Name, 
   b.User_Name, 
   c.Comments, 
   c.Reliability, 
   c.Rating
FROM company a
    INNER JOIN Users b
       ON a.???? = b.???

由于我没有你的表定义,我无法帮助你处理JOIN条件。向我们展示表格定义,我们将能够提供帮助。

<强>更新

因此,基于您的表格结构,您将寻找类似的内容:

SELECT *
FROM company cmp
INNER JOIN company_job cmpjb
    ON cmp.Company_ID = cmpjb.Company_ID
INNER JOIN jobs jb
    ON cmpjb.Job_ID = jb.Job_ID
INNER JOIN usercompjobrating ucmpjbr
    ON ucmpjbr.Comp_Job_ID = ucmpjbr.Comp_Job_ID
INNER JOIN users usr 
    ON usr.Users_id = ucmpjbr.Users_ID
INNER JOIN ratings rat
   ON rat.Rating_ID = ucmpjbr.Rating_ID

请注意,您不能在此连接中使用文件夹表,因为与文件夹表中的任何其他表没有主/外键关系。

我建议您仔细剖析此查询,如果您需要了解详细信息,请告知我们。

答案 1 :(得分:1)

有一点需要澄清,表格工作中的company_id是什么?

select ... (necessary fields to select)
from company c
join company_job cj using (company_id)
join jobs j using (job_id)
join usercompjobrating ucjr using (comp_job_id)
join ratings using (rating_Id)
join users using (users_id)