Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询-排序和分组的混合_Mysql_Sql_Sorting_Grouping - Fatal编程技术网

MySQL查询-排序和分组的混合

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 +----------------+ +--

我正试图从表格中获取以下信息:

按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 
+----------------+   +----------------+
| 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排序