加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在MySql中选择与一对多reationship右侧匹配的行

发布时间:2020-12-13 21:54:23 所属栏目:PHP教程 来源:网络整理
导读:我有4张桌子.一个用于公司,一个用于产品,一个用于公司地址,一个用于公司董事. 产品,主管和地址表与公司表有一对多的关系. 因此,一家公司可以拥有许多产品,许多地址和许多董事. CREATE TABLE IF NOT EXISTS `companies` ( `company_id` int(11) NOT NULL AUTO
我有4张桌子.一个用于公司,一个用于产品,一个用于公司地址,一个用于公司董事.

产品,主管和地址表与公司表有一对多的关系.

因此,一家公司可以拥有许多产品,许多地址和许多董事.

CREATE TABLE IF NOT EXISTS `companies` (
  `company_id` int(11) NOT NULL AUTO_INCREMENT,`company_name` varchar(50) NOT NULL,PRIMARY KEY (`company_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

CREATE TABLE IF NOT EXISTS `products` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,`company_id` int(11) NOT NULL,`product` varchar(50) NOT NULL,PRIMARY KEY (`product_id`),KEY `company_id` (`company_id`),KEY `product` (`product`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

CREATE TABLE IF NOT EXISTS `directors` (
  `director_id` int(11) NOT NULL AUTO_INCREMENT,`surname` varchar(100) NOT NULL,`dob` date NOT NULL,PRIMARY KEY (`director_id`),KEY `surname` (`surname`),KEY `dob` (`dob`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

CREATE TABLE IF NOT EXISTS `addresses` (
  `address_id` int(11) NOT NULL AUTO_INCREMENT,`company_id` int(1) NOT NULL,`postcode` varchar(10) NOT NULL,PRIMARY KEY (`address_id`),KEY `postcode` (`postcode`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

INSERT INTO `companies` (`company_id`,`company_name`) VALUES
(1,'Honda'),(2,'Toyota');

INSERT INTO `products` (`product_id`,`company_id`,`product`) VALUES
(1,1,'Civic'),'Accord'),(3,2,'Corolla'),(4,'Prius'),(5,'CRV');

INSERT INTO `directors` (`director_id`,`surname`,`dob`)     VALUES
(1,'Jones','1990-09-09'),'Smith','1980-08-08'),'Lucas','1970-07-07'),'Kelly','1960-06-06'),'Monty','1950-05-05');

INSERT INTO `addresses` (`address_id`,`postcode`) VALUES
(6,'12345'),(7,'23456'),(8,'34567'),(9,'45678'),(10,'56789');

我试图编写一个有效的查询(使用MySql / PDO)来找到匹配匹配导演(姓氏和dob)和地址(邮政编码)的公司的产品.

我只想列出每行一个匹配的产品,而不是单独列出每个导演或邮政编码.

到目前为止,我有下面的查询,这似乎有效,但它很难看,我怀疑在速度和效率方面这是一个荒谬的方式.

SELECT product
FROM products p
LEFT JOIN companies c USING(company_id)
WHERE :lname IN ( 
    SELECT surname 
    FROM directors d 
    WHERE c.company_id = d.company_id )
AND :dob IN ( 
    SELECT dob 
    FROM directors d 
    WHERE c.company_id = d.company_id )
AND :postcode IN ( 
    SELECT postcode 
    FROM addresses a 
    WHERE c.company_id = a.company_id )

预先感谢您的帮助.

解决方法

至少,导演上的两个子查询可以通过用exists运算符而不是in来重写它们.为了好的措施,我用这个运算符重写了整个查询,尽管它并不是绝对必要的:

SELECT    product
FROM      products p
LEFT JOIN companies c USING(company_id)
WHERE     EXISTS (SELECT * 
                  FROM directors d 
                  WHERE c.company_id = d.company_id AND 
                        (:lname  = d.lanme OR :dob = d.dob)) AND
           EXISTS (SELECT * 
                   FROM addresses a 
                   WHERE c.company_id = a.company_id AND :postcode = a.postcode)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读