0

私はテーブルを持っています:

ユーザー

id | first_name | last_name
 1   Johnny       Steve
 2   Kim          Borden

売上高

id | user_id | service_id | date
 1    1         2           2012-02-12
 2    1         6           2012-04-21

最近の販売情報が添付されたユーザーのリストを取得したいと思います。何も見つからない場合はNULL。

私がこれまでに持っているもの:

SELECT
    users.*,
    sales.*,
FROM
    users
LEFT JOIN
    sales ON users.id=sales.user_id

しかし、これは2つの売上があるため、ジョニーの2つのレコードを作成します。何か案は?

4

4 に答える 4

0

分析関数を使用しない場合、これはあなたがやろうとしていることを行うための非常に基本的な方法です:

select users.*, sales.*
from users, 
(select a.*
    from sales a,
        (select user_id, MAX(date) as mostRecentDate
        from sales
        group by user_id) b
    where a.user_id = b.user_id
      and a.date = b.mostRecentDate) sales
where users.id = sales.user_id;

現時点では、これをテストするために使用できる mysql サーバーがありません。エラーが発生した場合は、ポストバックしてください。

于 2012-07-23T21:47:55.653 に答える
0

SELECT u.id as id, u.first_name as first_name, u.last_name as last_name, MAX(s.date) as date FROM users as u LEFT JOIN sales as s on u.id = s.user_id GROUP BY id

クエリ構造のグループ タイプごとのより複雑な上位 N については、このリンクを確認してください。

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

于 2012-07-23T21:34:23.747 に答える
0
    SELECT u.*, s.*,
    FROM users u
    LEFT JOIN 
(select max(id) as sales_id, user_id from sales group by user_id) sa 
on sa.user_id = u.id
    LEFT JOIN sales s ON sa.user_id=s.user_id and s.id=sa.sales_id

編集: date を TIMESTAMP にすると、MAX() で id の代わりに使用できます。日付として保持する場合は引き続き使用できますが、1 日に複数のユーザーの販売があった場合は余分なレコードが取得されます。

于 2012-07-23T21:42:40.427 に答える
0
SELECT 
        u.*,
        SUBSTRING_INDEX(GROUP_CONCAT(s.id ORDER BY s.date DESC,s.id DESC),',',1) as sale_id,
        SUBSTRING_INDEX(GROUP_CONCAT(s.service_id ORDER BY s.date DESC,s.id DESC),',',1) as service_id,
        SUBSTRING_INDEX(GROUP_CONCAT(s.date ORDER BY s.date DESC,s.id DESC),',',1) as sale_date
FROM users u 
LEFT JOIN sales s ON s.user_id = u.id
GROUP BY u.id;

これは、時間がなくても「最後のセール」に最も近いものです。

于 2012-07-23T21:40:42.583 に答える