Pergunta

Here is my export.

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;
Foi útil?

Solução

You forgot to include the meaningful link on the foreign key in your where-clause:

db.sales.mail = db.customers.mail

Also, use brackets to group your conditions together. Something like cond1 OR cond2 AND cond3 will probably not work as expected, so for example you could write this as (cond1 OR cond2) AND cond3.

So something like this should work:

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)

While the above should work, it's better to write it like this (mostly for readability):

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

Note: I simply removed the final GROUP BY in your query, since I don't know what you're trying to accomplish with that. If you use GROUP BY, it should be on at least all selected columns that are not aggregate functions (like SUM, COUNT etc.)

Outras dicas

Use left join instead of inner join. Eg:

SELECT c.*, s.*
FROM customers c
LEFT JOIN sales s ON s.email = c.email;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top