Question

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;
Was it helpful?

Solution

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

OTHER TIPS

Use left join instead of inner join. Eg:

SELECT c.*, s.*
FROM customers c
LEFT JOIN sales s ON s.email = c.email;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top