2017-07-23 13 views
0

我在這裏有一個案例,我想創建一個基於3個表的前10個產品,這是最多的視圖,emails_request和apply_request,我的表結構是這樣的從3個表中獲得最多的產品

product_views

=================== 
id | product_id | date 
-------------------------- 
1 | 1   | today 
2 | 1   | today 
3 | 2   | today 

product_email_request

=================== 
id | product_id | date 
-------------------------- 
1 | 1   | today 
2 | 1   | today 
3 | 2   | today 

product_apply_request

=================== 
id | product_id | date 
-------------------------- 
1 | 1   | today 
2 | 2   | today 
3 | 2   | today 

,我的目標是才達到這樣的

product_id | view_count | email_count | apply_count 
========================================================== 
1   | 2   | 2   | 1 
2   | 1   | 1   | 2 

它可能做到這一點在MySQL?我很困惑,我沒有讀過,我應該使用聯盟這一點,但仍然不必須​​的線索..

這裏是SQL腳本

/* 
Navicat MariaDB Data Transfer 

Source Server   : LOKAL 
Source Server Version : 100121 
Source Host   : localhost:3306 
Source Database  : test 

Target Server Type : MariaDB 
Target Server Version : 100121 
File Encoding   : 65001 

Date: 2017-07-23 17:17:25 
*/ 

SET FOREIGN_KEY_CHECKS=0; 

-- ---------------------------- 
-- Table structure for product_apply 
-- ---------------------------- 
DROP TABLE IF EXISTS `product_apply`; 
CREATE TABLE `product_apply` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_id` int(11) DEFAULT NULL, 
    `creation` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Records of product_apply 
-- ---------------------------- 
INSERT INTO `product_apply` VALUES ('1', '1', '2017-07-23 17:17:00'); 
INSERT INTO `product_apply` VALUES ('2', '2', '2017-07-23 17:17:08'); 

-- ---------------------------- 
-- Table structure for product_emails 
-- ---------------------------- 
DROP TABLE IF EXISTS `product_emails`; 
CREATE TABLE `product_emails` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_id` int(11) DEFAULT NULL, 
    `creation` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Records of product_emails 
-- ---------------------------- 
INSERT INTO `product_emails` VALUES ('1', '1', '2017-07-23 16:46:32'); 
INSERT INTO `product_emails` VALUES ('2', '1', '2017-07-23 16:46:47'); 
INSERT INTO `product_emails` VALUES ('3', '2', '2017-07-23 16:47:05'); 
INSERT INTO `product_emails` VALUES ('4', '2', '2017-07-23 16:47:47'); 
INSERT INTO `product_emails` VALUES ('5', '3', '2017-07-23 17:00:18'); 
INSERT INTO `product_emails` VALUES ('6', '1', '2017-07-23 17:00:29'); 

-- ---------------------------- 
-- Table structure for product_views 
-- ---------------------------- 
DROP TABLE IF EXISTS `product_views`; 
CREATE TABLE `product_views` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_id` int(11) NOT NULL, 
    `creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Records of product_views 
-- ---------------------------- 
INSERT INTO `product_views` VALUES ('1', '1', '2017-07-23 16:47:25'); 
INSERT INTO `product_views` VALUES ('2', '1', '2017-07-23 16:47:32'); 
INSERT INTO `product_views` VALUES ('3', '2', '2017-07-23 16:47:38'); 

任何幫助將是真棒.. 三江源

+0

見https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

+0

是的,可以用MySQL來做到這一點。您需要加入這三個表格,然後對每個表格中相應產品的記錄進行計數/求和。當你陷入困境時,請自己去發佈你的代碼。 – fubar

+0

@fubar我的問題是我真的迷路了,直到我不知道我應該在查詢上寫什麼,因爲我是新的在mysql .. –

回答

0

以下查詢會爲您提供您想要的結果。

我已經寫了products表(我假設存在)的所有產品,然後在其他每個表上使用LEFT JOIN。通過使用LEFT JOIN,它可確保產品仍將包含在結果中,即使其中一個或多個其他表中沒有條目。相應的計數值將僅爲零。

SELECT p.id, COUNT(DISTINCT pa.id) AS apply_count, COUNT(DISTINCT pe.id) AS email_count, COUNT(DISTINCT pv.id) AS view_count 
FROM products p 
LEFT JOIN product_apply pa ON (p.id = pa.product_id) 
LEFT JOIN product_emails pe ON (p.id = pe.product_id) 
LEFT JOIN product_views pv ON (p.id = pv.product_id) 
GROUP BY p.id 
相關問題