来自两个表的查询数据不起作用,查询只有单个表工作

时间:2014-04-17 19:27:11

标签: mysql foreign-keys

这是我的导出。

CREATE TABLE IF NOT EXISTS `table1` (
  `order_id` int(7) NOT NULL DEFAULT '0',
  `order_date` varchar(8) DEFAULT NULL,
  `tkt_order_id` int(9) DEFAULT NULL,
  `event_date` varchar(8) DEFAULT NULL,
  `event_name` varchar(6) DEFAULT NULL,
  `event_year` int(4) DEFAULT NULL,
  `mail` varchar(60) NOT NULL,
  `quantity` int(3) DEFAULT NULL,
  `ticket_type` varchar(7) DEFAULT NULL,
  `ticket_days` varchar(9) DEFAULT NULL,
  `ticket_subtype` varchar(18) DEFAULT NULL,
  `base` varchar(10) DEFAULT NULL,
  `service` varchar(10) DEFAULT NULL,
  `gross` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`order_id`),
  UNIQUE KEY `order_id` (`order_id`) USING BTREE,
  KEY `email` (`mail`,`order_date`,`event_name`,`event_year`,`quantity`,`ticket_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `table2` (
  `mail` varchar(60) NOT NULL DEFAULT '',
  `first_name` varchar(27) DEFAULT NULL,
  `lastname` varchar(20) DEFAULT NULL,
  `address` varchar(63) DEFAULT NULL,
  `address2` varchar(38) DEFAULT NULL,
  `city` varchar(27) DEFAULT NULL,
  `state` varchar(22) DEFAULT NULL,
  `zip` varchar(10) DEFAULT NULL,
  `country` varchar(20) DEFAULT NULL,
  `phone` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`mail`),
  UNIQUE KEY `mail` (`mail`) USING BTREE,
  KEY `index` (`first_name`,`lastname`,`city`,`state`,`zip`,`country`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



ALTER TABLE `table1`
  ADD CONSTRAINT `table1_ibfk_1` FOREIGN KEY (`mail`) REFERENCES `table2` (`mail`) ON DELETE NO ACTION ON UPDATE NO ACTION;

2 个答案:

答案 0 :(得分:1)

您忘记在where子句中的外键中包含有意义的链接:

db.sales.mail = db.customers.mail

另外,使用括号将条件组合在一起。 cond1 OR cond2 AND cond3之类的内容可能无法正常工作,例如,您可以将其写为(cond1 OR cond2) AND cond3

所以这样的事情应该有效:

SELECT db.customers.first_name, 
 db.customers.last_name, 
 db.customers.mail, 
 db.sales.event_year, 
 db.sales.ticket_type, 
 db.sales.event_name
FROM db.sales, db.customers
WHERE db.sales.mail = db.customer.mail
AND (db.sales.ticket_type = "ticket1" 
OR db.sales.ticket_type = "ticket2" 
OR db.sales.ticket_type = "ticket3")
AND (db.sales.event_year=2009 
OR db.sales.event_year=2010)

虽然上述内容应该有效,但最好这样写(主要是为了提高可读性):

SELECT c.first_name, 
 c.last_name, 
 c.mail, 
 s.event_year, 
 s.ticket_type, 
 s.event_name
FROM db.sales s
INNER JOIN db.customer c ON s.mail = c.mail
WHERE s.ticket_type IN ('ticket1','ticket2','ticket3')
AND s.event_year IN (2009,2010);

注意:我只是删除了您的查询中的最终GROUP BY,因为我不知道您正在尝试用它完成什么。如果您使用GROUP BY,则它应至少包含所有非聚合函数的选定列(例如SUMCOUNT等。)

答案 1 :(得分:-1)

使用左连接而不是内连接。例如:

SELECT c.*, s.*
FROM customers c
LEFT JOIN sales s ON s.email = c.email;