use*_*742 7 php mysql sql group-by sql-order-by
这是我的完整查询:
SELECT * FROM `clientgroupassign`
LEFT JOIN `clients` ON `clientgroupassign`.clientId = `clients`.clientId
LEFT JOIN `users` ON `carerId` = `userId`
LEFT JOIN
(SELECT * FROM
(SELECT * FROM `contacts` WHERE `contactGroup` = 4 ORDER BY `contactId` DESC)
as `contacts`
GROUP BY (`contactClientId`)
) AS `contacts` ON `contactClientId` = `clients`.clientId
WHERE groupId = 4
ORDER BY `clients`.clientId
Run Code Online (Sandbox Code Playgroud)
第三次连接存在问题导致脚本执行约1分钟.当我在PMA中分开运行时:
SELECT * FROM (SELECT * FROM `contacts` WHERE `contactGroup` = 4 ORDER BY `contactId` DESC) AS `contacts` GROUP BY (`contactClientId`)
Run Code Online (Sandbox Code Playgroud)
执行仍然很长.
我想要的是为contacts第4组中的每个客户端添加一个,最后添加的行(客户端可以在不同的组中).
谢谢.
要获取"组4中每个客户的联系人最后添加的行",请尝试以下操作:
SELECT
c.*
FROM(
SELECT
contactClientId,
MAX(contactId) as cid
FROM
contacts
WHERE
contactGroup = 4
GROUP BY
contactClientId
ORDER BY
NULL
) as tmp
INNER JOIN contacts as c
ON c.contactId = tmp.cid
AND c.contactClientId = tmp.contactClientId
Run Code Online (Sandbox Code Playgroud)
如果contactId是PK,contacts则不需要第二个连接子句.
默认情况下,MySQL会对所有GROUP BY col1,col2,...查询进行排序,就好像您在查询中指定了ORDER BY col1,col2,.... 如果显式包含一个包含相同列列表的ORDER BY子句,MySQL会在没有任何速度惩罚的情况下对其进行优化,尽管排序仍然存在.如果查询包含GROUP BY但您希望避免对结果进行排序的开销,则可以通过指定ORDER BY NULL来禁止排序.
完整的文档.
完整查询:
SELECT * FROM `clientgroupassign`
LEFT JOIN `clients` ON `clientgroupassign`.clientId = `clients`.clientId
LEFT JOIN `users` ON `carerId` = `userId`
LEFT JOIN
(
SELECT
c.*
FROM(
SELECT
contactClientId,
MAX(contactId) as cid
FROM
contacts
WHERE
contactGroup = 4
GROUP BY
contactClientId
ORDER BY
NULL
) as tmp
INNER JOIN contacts as c
ON c.contactId = tmp.cid
AND c.contactClientId = tmp.contactClientId
) AS `contacts` ON `contactClientId` = `clients`.clientId
WHERE groupId = 4
ORDER BY `clients`.clientId
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1011 次 |
| 最近记录: |