2016-08-11 3 views
-1
goods 
id  name  rent_price 
1  Toyota  400000 
2  Honda  500000 
3  Mazda  600000 
4  Suzuki  700000 
5  KIA  800000 

を求めます。は、MySQLのクエリ

customers 
id  name 
1  Ali 
2  Budi 
3  Candra 
4  Doni 
5  Eka 

history_transactions 
id customer_id  date 
1  1    2016-03-01 15:00:00 
2  4    2016-03-02 15:00:00 
3  4    2016-03-02 17:00:00 
4  2    2016-03-03 09:00:00 
5  4    2016-03-05 10:00:00 
6  1    2016-04-06 10:00:00 
7  5    2016-05-07 10:00:00 
8  2    2016-06-08 10:00:00 
9  1    2016-07-09 10:00:00 
10  2    2016-08-10 10:00:00 

history_rents 
id history_transaction_id   good_id 
1    1      1 
2    2      2 
3    2      5 
4    3      3 
5    4      1 
6    4      2 
7    4      3 
8    4      4 
9    4      5 
10    5      5 
11    6      3 
12    7      4 
13    8      3 
14    9      1 
15    10      1 

私は顧客のための 18.000行が

私は数日の顧客は、各顧客

customers 
id  name  day_trans 
1  Ali   3 
2  Budi   3 
3  Candra   0 
4  Doni   2 (history_transaction_id 2 & 3 count as 1) 
5  Eka   1 

のトランザクションを行う必要があるデータ履歴取引のため 165.000行の多くを持っていると私はアイテムをカウントする必要があります各顧客のために借り

customers 
id  name  rent_count 
1  Ali   3 
2  Budi   7 
3  Candra   0 
4  Doni   4 
5  Eka   1 

クエリのために助けてください、あなたは、2つの異なるクエリを介して2つの出力を好む場合はどのようなフィールドIは、インデックス

+0

とを試してみましたか?私は、各顧客のためのループでPHPを使用し、そしてそれを数える....しかし、それは、データを取得するために非常に長い時間がかかります.... – 1000111

+0

ありがとうそのデータを取得するためのベストプラクティスですか?またはそのデータを生成することができます任意のクエリまたはスクリプトがある... :( – Teddy

+0

あなた – Teddy

答えて

0

のために作る必要があります。

出力#1:

customers 
id  name  day_trans 
1  Ali   3 
2  Budi   3 
3  Candra   0 
4  Doni   2 (history_transaction_id 2 & 3 count as 1) 
5  Eka   1 

クエリ#1:

SELECT 
C.id, 
C.name, 
COUNT(DISTINCT DATE(HT.`date`)) AS day_trans 
FROM customers C 
INNER JOIN history_transactions HT 
ON C.id = HT.customer_id 
GROUP BY C.id 
ORDER BY C.id; 

出力#2:

customers 
id  name  rent_count 
1  Ali   3 
2  Budi   7 
3  Candra   0 
4  Doni   4 
5  Eka   1 

クエリ#2:

SELECT 
    C.id, 
    C.name, 
    COALESCE(t.total,0) AS rent_count 
FROM customers C 
LEFT JOIN 
(
    SELECT 
    HT.customer_id, 
    COUNT(*) total 
    FROM history_rents HR 
    INNER JOIN history_transactions HT 
    ON HR.history_transaction_id = HT.id 
    GROUP BY HT.customer_id 
) AS t 
ON C.id = t.customer_id 
ORDER BY C.id; 

そして、あなたは1を介してそれらを取得したい場合:

SELECT 
    C.id, 
    C.name, 
    COALESCE(t.day_trans,0) AS day_trans 
    COALESCE(t.total_rent,0) AS rent_count 
FROM customers C 
LEFT JOIN 
(
    SELECT 
    HT.customer_id, 
    COUNT(DISTINCT DATE(HT.`date`)) AS day_trans, 
    COUNT(*) total_rent 
    FROM history_rents HR 
    INNER JOIN history_transactions HT 
    ON HR.history_transaction_id = HT.id 
    GROUP BY HT.customer_id 
) AS t 
ON C.id = t.customer_id 
+0

を関心のうち見てみましょう、なぜあなたは使用しません左手に参加中のサブクエリ?それは、すべてのインデックスを破り、多くのことを、それを遅くすることはありませんだろうか? – tomb

0

あなたは同じクエリでそれらの両方を行うことができます:あなたは何を

SELECT c.id, c.name, count(distinct date(ht.date)) as day_trans, count(*) as rent_count 
FROM customers c 
LEFT JOIN history_transactions ht on c.id=ht.customer_id 
LEFT JOIN history_rents hr on ht.id=hr.history_transaction_id 
GROUP by c.id