MySQL查询-排序和分组的混合
我正试图从表格中获取以下信息: 按b排序表A升序,表b降序 在本例中,所有具有特定值的u首先显示为u=3,然后顺序并不重要 N NULL始终在末尾 不可能出现两次r,但必须出现所有不同的r 由IFNULLu订购,9999999!=3,u,b标准1,2和3起作用,但最后,我没有任何线索 使用DISTINCT我无法达到目标,就像使用GROUP BY一样 有人有主意吗? 非常感谢MySQL查询-排序和分组的混合,mysql,sql,sorting,grouping,Mysql,Sql,Sorting,Grouping,我正试图从表格中获取以下信息: 按b排序表A升序,表b降序 在本例中,所有具有特定值的u首先显示为u=3,然后顺序并不重要 N NULL始终在末尾 不可能出现两次r,但必须出现所有不同的r 由IFNULLu订购,9999999!=3,u,b标准1,2和3起作用,但最后,我没有任何线索 使用DISTINCT我无法达到目标,就像使用GROUP BY一样 有人有主意吗? 非常感谢 start table target table A +----------------+ +--
start table target table A
+----------------+ +----------------+
| id | r | u | b | | id | r | u | b |
+----------------+ +----------------+
| 1 | 1 | 1 | 9 | | 18 | 5 | 3 | 1 |
| 2 | 1 | 3 | 4 | | 2 | 1 | 3 | 4 |
| 3 | 1 | 4 | 6 | | 15 | 4 | 3 | 7 |
| 4 | 1 | 5 | 5 | | 11 | 3 | 3 | 8 |
| 5 | 2 | 1 | 2 | | * | 2 | * | * |
| 6 | 2 | 2 | 1 | | 21 | 6 | N | N |
| 7 | 2 | 4 | 5 | +----------------+
| 8 | 2 | 5 | 7 |
| 9 | 3 | 1 | 4 |
| 10 | 3 | 2 | 3 |
| 11 | 3 | 3 | 8 |
| 12 | 3 | 5 | 2 | target table B
| 13 | 4 | 1 | 3 | +----------------+
| 14 | 4 | 2 | 2 | | id | r | u | b |
| 15 | 4 | 3 | 7 | +----------------+
| 16 | 4 | 4 | 6 | | 11 | 3 | 3 | 8 |
| 17 | 5 | 2 | 9 | | 15 | 4 | 3 | 7 |
| 18 | 5 | 3 | 1 | | 2 | 1 | 3 | 4 |
| 19 | 5 | 4 | 6 | | 18 | 5 | 3 | 1 |
| 20 | 5 | 5 | 4 | | * | 2 | * | * |
| 21 | 6 | N | N | | 21 | 6 | N | N |
+----------------+ +----------------+
更新:
SELECT *
FROM objects o
LEFT JOIN
ratings r
ON r.id = COALESCE(
(
SELECT id
FROM ratings
WHERE object_id = o.id
AND user_id = :myuser
ORDER BY
rating DESC
LIMIT 1
),
(
SELECT id
FROM ratings
WHERE object_id = o.id
ORDER BY
rating DESC
LIMIT 1
)
)
更新:
SELECT *
FROM objects o
LEFT JOIN
ratings r
ON r.id = COALESCE(
(
SELECT id
FROM ratings
WHERE object_id = o.id
AND user_id = :myuser
ORDER BY
rating DESC
LIMIT 1
),
(
SELECT id
FROM ratings
WHERE object_id = o.id
ORDER BY
rating DESC
LIMIT 1
)
)
当R列上的值超过2个时,如何选择要采用的行?我不确定我是否理解您的意思,targetA和targetB是StartTable的输出吗?您能显示您的代码吗?start table是数据库中的表,target tables是我想要的结果。当R列上有2个以上的值时,您如何选择要采用的行?我不确定我是否理解你的意思,targetA和targetB是StartTable的输出吗?你能展示你的代码吗?start table是db中的表,target tables是我想要的结果这个结构有特殊的名称吗?我想理解这一点,但我不能@Seamanx:我相信是相关子查询。在所有其他主要系统中,您可能只使用了ROW_NUMBER(窗口函数),但MySQL不支持它。如果我的表mytable是一个左连接表a左连接B ON a.id=B.r,那么这个相关子查询如何工作?我想,我不能给联接表一个别名来使用。@Seamanx:回答您的直接问题,是的,您可以:从a.id=b.r q上的左联接b中选择*FROM SELECT*。但从表面上看,您的整个设置并不是解决实际问题的最有效方法。如果你更详细地发布你的问题,我们可能会提出更好的解决方案。我有一个表a,其中列出了具有属性的对象,在表B中列出了用户u,用户u将B评为对象r。目的是显示所有对象的列表,每个对象仅按一个用户的排名排序一次。对我来说,所有用户的排名都比较容易:SELECT*,avg B.B作为bb从A.id=B.r组上的左连接B按A.id顺序按bb这个结构有特殊的名称吗?我想理解这一点,但我不能@Seamanx:我相信是相关子查询。在所有其他主要系统中,您可能只使用了ROW_NUMBER(窗口函数),但MySQL不支持它。如果我的表mytable是一个左连接表a左连接B ON a.id=B.r,那么这个相关子查询如何工作?我想,我不能给联接表一个别名来使用。@Seamanx:回答您的直接问题,是的,您可以:从a.id=b.r q上的左联接b中选择*FROM SELECT*。但从表面上看,您的整个设置并不是解决实际问题的最有效方法。如果你更详细地发布你的问题,我们可能会提出更好的解决方案。我有一个表a,其中列出了具有属性的对象,在表B中列出了用户u,用户u将B评为对象r。目的是显示所有对象的列表,每个对象仅按一个用户的排名排序一次。对我来说,所有用户的排名都比较容易:选择*,平均B.B为bb,从A.id上的左连接B=B.r组按A.id排序按bb排序