使用 union all 并基于 2 个不同条件选择 25 条记录 (9+16) 的单个 mysql 查询
single mysql query for choosing 25 records (9+16) using union all and based on 2 different conditions
我需要使用 mysql 获取 25 条记录,其中前 9 条必须基于 likes
计数的降序(随机选择)从 200 个最受赞赏的项目和剩余项目中 随机 平衡 16 个(不包括 9,已过滤 )。是否可以使用单个 mysql 查询来执行此操作?任何帮助将不胜感激。
这是我的查询...
(SELECT * FROM (SELECT tiles.,users.first_name,users.last_name, users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count FROM tiles
LEFT JOIN tile_appreciations
ON tile_appreciations
.tile_id
= tiles
.id
INNER JOIN users
ON users
.id
= tiles
.user_id
LEFT JOIN user_settings
ON user_settings
.user_id
= tiles
.user_id
WHERE tiles
.view_mode
= 'PB' AND users
.status
= 'Y' AND tiles
.moved_stat
= '1' AND user_settings
.public_profile
= 'Y' GROUP BY tiles
.id
ORDER BY appreciation_count
DESC LIMIT 200) as t1 ORDER BY RAND() LIMIT 9) UNION ALL (SELECT tiles.,users.first_name,users.last_name,users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count FROM tiles
LEFT JOIN tile_appreciations
ON tile_appreciations
.tile_id
= tiles
.id
INNER JOIN users
ON users
.id
= tiles
.user_id
LEFT JOIN user_settings
ON user_settings
.user_id
= tiles
.user_id
WHERE tiles
.view_mode
= 'PB' AND users
.status
= 'Y' AND tiles
.moved_stat
= '1' AND user_settings
.public_profile
= 'Y' GROUP BY tiles
.id
ORDER BY RAND() LIMIT 16)
我不知道使用 UNION ALL
是否是一个硬性要求,但是 SQL 已经有一个非常好的系统可以在第二个查询中过滤掉第一个查询的结果:它被称为UNION
。您可以通过将最好的 200 个中的 9 个和整个集合中的 25 个合并,然后将总结果限制为 25,来选择剩余的 16 个。我在这里假设 UNION
将从第二个集合中删除重复项,并且不是第一个。
尝试这样的事情:
SELECT * FROM (
SELECT * FROM (
SELECT tiles.*,users.first_name,users.last_name, users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count
FROM tiles LEFT JOIN tile_appreciations ON tile_appreciations.tile_id = tiles.id INNER JOIN users ON users.id = tiles.user_id LEFT JOIN user_settings ON user_settings.user_id = tiles.user_id
WHERE tiles.view_mode = 'PB' AND users.status = 'Y' AND tiles.moved_stat = '1' AND user_settings.public_profile = 'Y'
GROUP BY tiles.id
ORDER BY appreciation_count DESC LIMIT 200
) as best200
ORDER BY RAND()
LIMIT 9
) UNION (
SELECT tiles.*,users.first_name,users.last_name,users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count
FROM tiles LEFT JOIN tile_appreciations ON tile_appreciations.tile_id = tiles.id INNER JOIN users ON users.id = tiles.user_id LEFT JOIN user_settings ON user_settings.user_id = tiles.user_id
WHERE tiles.view_mode = 'PB' AND users.status = 'Y' AND tiles.moved_stat = '1' AND user_settings.public_profile = 'Y'
GROUP BY tiles.id
ORDER BY RAND()
LIMIT 25
)
LIMIT 25;
我需要使用 mysql 获取 25 条记录,其中前 9 条必须基于 likes
计数的降序(随机选择)从 200 个最受赞赏的项目和剩余项目中 随机 平衡 16 个(不包括 9,已过滤 )。是否可以使用单个 mysql 查询来执行此操作?任何帮助将不胜感激。
这是我的查询...
(SELECT * FROM (SELECT tiles.,users.first_name,users.last_name, users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count FROM
tiles
LEFT JOINtile_appreciations
ONtile_appreciations
.tile_id
=tiles
.id
INNER JOINusers
ONusers
.id
=tiles
.user_id
LEFT JOINuser_settings
ONuser_settings
.user_id
=tiles
.user_id
WHEREtiles
.view_mode
= 'PB' ANDusers
.status
= 'Y' ANDtiles
.moved_stat
= '1' ANDuser_settings
.public_profile
= 'Y' GROUP BYtiles
.id
ORDER BYappreciation_count
DESC LIMIT 200) as t1 ORDER BY RAND() LIMIT 9) UNION ALL (SELECT tiles.,users.first_name,users.last_name,users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count FROMtiles
LEFT JOINtile_appreciations
ONtile_appreciations
.tile_id
=tiles
.id
INNER JOINusers
ONusers
.id
=tiles
.user_id
LEFT JOINuser_settings
ONuser_settings
.user_id
=tiles
.user_id
WHEREtiles
.view_mode
= 'PB' ANDusers
.status
= 'Y' ANDtiles
.moved_stat
= '1' ANDuser_settings
.public_profile
= 'Y' GROUP BYtiles
.id
ORDER BY RAND() LIMIT 16)
我不知道使用 UNION ALL
是否是一个硬性要求,但是 SQL 已经有一个非常好的系统可以在第二个查询中过滤掉第一个查询的结果:它被称为UNION
。您可以通过将最好的 200 个中的 9 个和整个集合中的 25 个合并,然后将总结果限制为 25,来选择剩余的 16 个。我在这里假设 UNION
将从第二个集合中删除重复项,并且不是第一个。
尝试这样的事情:
SELECT * FROM (
SELECT * FROM (
SELECT tiles.*,users.first_name,users.last_name, users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count
FROM tiles LEFT JOIN tile_appreciations ON tile_appreciations.tile_id = tiles.id INNER JOIN users ON users.id = tiles.user_id LEFT JOIN user_settings ON user_settings.user_id = tiles.user_id
WHERE tiles.view_mode = 'PB' AND users.status = 'Y' AND tiles.moved_stat = '1' AND user_settings.public_profile = 'Y'
GROUP BY tiles.id
ORDER BY appreciation_count DESC LIMIT 200
) as best200
ORDER BY RAND()
LIMIT 9
) UNION (
SELECT tiles.*,users.first_name,users.last_name,users.mosaicname,users.country,users.city,users.state,users.profile_image,COUNT(tile_appreciations.tile_id) AS appreciation_count
FROM tiles LEFT JOIN tile_appreciations ON tile_appreciations.tile_id = tiles.id INNER JOIN users ON users.id = tiles.user_id LEFT JOIN user_settings ON user_settings.user_id = tiles.user_id
WHERE tiles.view_mode = 'PB' AND users.status = 'Y' AND tiles.moved_stat = '1' AND user_settings.public_profile = 'Y'
GROUP BY tiles.id
ORDER BY RAND()
LIMIT 25
)
LIMIT 25;