来自两个表的SQL查询按两个表列排序结果

时间:2013-11-30 21:54:24

标签: php mysql sql join sql-order-by

我有两张表用于注册外出电话。

第一个表是。该计划是:

-----------------------------------
id | fname | lname | phone_number |
-----------------------------------
1  | John  | Black | 132333312    |
2  | Marry | White | 172777441    |
-----------------------------------

第二个名为的表格。该计划是:

----------------------------------------------------------------------
id | scr_phone | dst_phone | dst_public_id | date      | notes       |
----------------------------------------------------------------------
1  | 555       | 132333312 | 1             | 1.12.2013 | chit-chat   |
2  | 555       | 172777441 | 2             | 1.12.2013 | serios talk |
3  | 555       | 172777441 | 2             | 2.12.2013 | conversation|
----------------------------------------------------------------------

我显示的用户手机列表不是按字母顺序排列,而是按通话频率显示。因此,无论谁从本地电话555拨打电话,都会看到他/她经常呼叫的人。这是我用于它的MySQL查询:

SELECT p.fname, p.lname, c.notes, COUNT(c.dst_public_id) AS amount
FROM people p
JOIN calls c ON c.dst_public_id = p.id
WHERE phones != ''
GROUP BY p.id
ORDER BY amount DESC, p.lname ASC

结果我在电话列表的顶部找到了第2个人,第2个人在第2位(我计算每个公众的电话数量,并按该数量订购)。这是查询结果:

--------------------------------
fname | lname | notes | amount |
--------------------------------
Marry | White |       |  2     |
John  | Black |       |  1     |
--------------------------------

这一切都很好。但我希望始终显示最后一次对该人的描述。我可以为每个请求每个人的最后记录并从中获取数据的人做一个完全独立的MySQL查询,例如:

SELECT notes FROM calls WHERE dst_public_id = 2 ORDER BY date DESC LIMIT 1

...然后在我的PHP脚本中添加第一个查询的结果,但有没有办法用一个查询做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用group_concat()substring_index()获取以下MySQL技巧的最后一个注释:

SELECT p.fname, p.lname, c.notes, COUNT(c.dst_public_id) AS amount,
       substring_index(group_concat(notes order by id desc separator '^'), '^', 1) as last_notes
FROM people p JOIN
     calls c
     ON c.dst_public_id = p.id
WHERE phones != ''
GROUP BY p.id
ORDER BY amount DESC, p.lname ASC;

为此,您需要一个永远不会出现在音符中的分隔符。我为此选择了'^'

答案 1 :(得分:1)

你能试试吗?我没有测试它,因为我没有 在我面前的SQL,但你应该明白这一点。

SELECT tbl.notes, tbl.amount, p.fname, p.lname

FROM people p

join
(
select t.dst_public_id, c1.notes, t.cnt as amount
from calls c1 join 
   (
      SELECT c2.dst_public_id, count(c2.id) as cnt, max(c2.id) as id
      FROM 
      calls c2
      group by c2.dst_public_id
   ) t on c1.id = t.id
) tbl on p.id = tbl.dst_public_id

WHERE p.phones != ''
GROUP BY p.id
ORDER BY tbl.amount DESC, p.lname ASC