这是我的导出。
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;
答案 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
,则它应至少包含所有非聚合函数的选定列(例如SUM
,COUNT
等。)
答案 1 :(得分:-1)
使用左连接而不是内连接。例如:
SELECT c.*, s.*
FROM customers c
LEFT JOIN sales s ON s.email = c.email;