2015-03-25 2 views
0

Так что я работаю с запросами на пару лет, , а иногда я спрашиваю себя, нет ли более простого способа, или более сложный способ заставить его работать. Поэтому сегодня я столкнулся с ситуацией, когда у меня есть таблица, скажем пользователей, и я хочу сделать несколько сравнений с этой таблицей.Сравнение с таблицей в MySQL

В этом случае получите статистику от каждого пользователя, которого у меня есть: узнать, сколько заказов он сделал или сколько у него товаров в списке желаний за определенный период (ы) времени; например, на прошлой неделе и на этой неделе. Так что я хочу знать, если лучший способ заключается в использовании left joins и ifs так:

SELECT 
users.id, 
SUM(IF(wishlist.date = LAST_WEEK, 1, 0)) LAST_WEEK_WISHLIST, 
SUM(IF(wishlist.date = THIS_WEEK, 1, 0)) THIS_WEEK_WISHLIST, 
SUM(IF(orders.date = LAST_WEEK, 1, 0)) LAST_WEEK_ORDERS, 
SUM(IF(orders.date = THIS_WEEK, 1, 0)) THIS_WEEK_ORDERS 
FROM 
users 
LEFT JOIN wishlist ON users.id = wishlist.user_id 
LEFT JOIN orders ON users.id = orders.user_id 
... 
GROUP BY users.id 
ORDER BY users.id ASC 

... или есть лучше или более оптимизированный способ сделать это.

Заранее спасибо

+0

Просьба представить 'ШОУ CREATE TABLE' для 3 таблиц, а также сообщите нам, насколько велики таблицы. Кроме того, старые данные «статические»? То есть мы можем обобщить старые данные и только «вычислить» текущие данные? –

+0

СОЗДАТЬ пользователей TABLE ( user_id INT NOT NULL AUTO_INCREMENT, электронной VARCHAR (80) NOT NULL, display_name VARCHAR (50) NOT NULL, пароль CHAR (41) NOT NULL, PRIMARY KEY (user_id), UNIQUE INDEX (электронная почта) ) ДВИГАТЕЛЬ = INNODB; –

+0

CREATE TABLE WishList ( user_id INT NOT NULL, product_id INT NOT NULL, FOREIGN KEY (user_id) Лит пользователей (user_id), FOREIGN KEY (product_id) Лит продукты (PRODUCT_ID) ) –

ответ

-2

Я бы рекомендовал пытаться использовать подзапросы вместо того, чтобы присоединиться это может сделать разницу

Вот пример того, как я решил эту

SELECT l_outer.Locations_LocationID, l_outer.Locations_LocationName, 

ifnull((SELECT format(sum(replace(Payments_Amount, '$', '')), 2) as card_total 
    FROM Payments as p 
    where p.Payments_PaymentItem in ('Visa', 'MasterCard', 'Discover') AND p.Payments_LocationID = l_outer.Locations_LocationID AND STR_TO_DATE(Payments_Date, '%m/%d/%Y') >= DATE_SUB(curdate(),INTERVAL (DAY(curdate())-1) DAY) 
    group by p.Payments_LocationID), 0.00) Cards, 

ifnull((SELECT format(sum(replace(Payments_Amount, '$', '')), 2) as AmericanExpress_total 
    FROM Payments as p 
    where p.Payments_PaymentItem = 'American Express' AND p.Payments_LocationID = l_outer.Locations_LocationID AND STR_TO_DATE(Payments_Date, '%m/%d/%Y') >= DATE_SUB(curdate(),INTERVAL (DAY(curdate())-1) DAY) 
    group by p.Payments_LocationID), 0.00) AmericanExpress 

From Locations as l_outer 
Смежные вопросы