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);