Mysql 从两个表查询数据不起作用,仅查询一个表起作用

Mysql 从两个表查询数据不起作用,仅查询一个表起作用,mysql,foreign-keys,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, `ev

这是我的出口

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;

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

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

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

db.sales.mail = db.customers.mail
此外,使用括号将条件分组在一起。类似于
cond1或cond2和cond3的内容可能无法按预期工作,因此,例如,您可以将其编写为
(cond1或cond2)和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)
虽然上面的内容应该有效,但最好是这样写(主要是为了可读性):


注意:我只是在您的查询中删除了最后一个
groupby
,因为我不知道您想用它实现什么。如果使用
分组依据
,则至少应在所有非聚合函数的选定列上(如
求和
计数
等)

哪里是不按预期工作的查询?销售表和失败的查询(以及其中的错误/结果)都丢失。问题是重复行,根据帖子,没有错误。可能尝试选择DISTINCT以忽略重复的行?没有理由使用
左联接
。当我回答没有创建表代码时,两个邮件列都不能为空。但你是对的。
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);