正常排序一行,但第三行JOIN行的其他值排序第二行

时间:2017-07-05 13:24:42

标签: mysql sql

在这些表中

[   id    -   title   -   meta ]
[    1    -     A     -    A1  ]
[    2    -     A     -    A2  ]
[    3    -     A     -    A3  ]
[    4    -     C     -    A1  ]
[    5    -     C     -    A3  ]
[    6    -     B     -    B1  ]
[    7    -     B     -    B2  ]

[    id     -    rating  -     title     -   meta  ]
[    1      -       9    -       A       -    A1   ]
[    2      -       5    -       C       -    A1   ]
[    3      -       4    -       A       -    A2   ]
[    4      -       6    -       A       -    A3   ]
[    5      -       8    -       B       -    B1   ]
[    6      -       18   -       C       -    A3   ]
[    7      -       12   -       B       -    B2   ]

现在我的查询是

"SELECT DISTINCT a.title, a.meta, SUM(ra.vote) as rating
FROM table1 a LEFT JOIN table2 b ON a.meta = b.meta AND a.title = b.title
WHERE a.title = :title
ORDER BY a.title, rating DESC"

在我的PHP代码中,我echotitleDISTINCT然后我将meta s的所有值放在其title重复的位置在它之下。

现在我的问题是,我希望ORDER meta的值取决于rating

我得到的是随机顺序,但我希望它像这样

                A
      A1(9) -> A3(6) -> A2(4)

                B
         B2(12) -> B1(8)

                C
         A3(18) -> A1(5)

因此,当我获得meta s值时,它会按rating

排序

类似这样的事情

[   id    -   title   -   meta    -    rating ]
[    1    -     A     -    A1     -       9   ]
[    3    -     A     -    A3     -       6   ]
[    3    -     A     -    A2     -       4   ]
[    5    -     B     -    B2     -       12  ]
[    6    -     C     -    A3     -       18  ]
[    2    -     C     -    A1     -       5   ]

1 个答案:

答案 0 :(得分:0)

  

我得到的是随机顺序

你得到的不是随机顺序而是随机数据。

查询:

SELECT a.title, a.meta
...
GROUP BY a.meta

是无效的SQL。对于包含GROUP BY子句的查询,SELECT子句只允许包含这些类型的表达式:

  • 表达式也出现在GROUP BY子句中;
  • GROUP BY aggregate functions;
  • 在功能上依赖于GROUP BY子句中出现的表达式的表达式。

a.title子句中的SELECT表达式不适用于上述任何类别。

在5.7.5版之前,MySQL接受此类查询,但是,documentation explains

  

...标准SQL使用GROUP BY的MySQL扩展允许选择列表,HAVING条件或ORDER BY列表引用非聚合列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。此外,添加ORDER BY子句不会影响每个组中值的选择。

用简单的英语表示什么?

看看第二张表中的前两行:

[    id     -    rating  -     title     -   meta  ]
[    1      -       9    -       A       -    A1   ]
[    2      -       5    -       C       -    A1   ]

再次询问相关部分:

SELECT a.title, a.meta
...
GROUP BY a.meta

MySQL从这两行创建一个组(因为GROUP BY a.meta)。从一个组中,使用SELECT子句中提供的表达式在结果集中生成一行。

它应该为a.title选择什么值?如上所述,它选择其中一个没有任何规则。

现在可以选择A,但如果您在表格中的数据发生更改后运行查询,则可以选择C,此外,如果您导出表格,它可以选择C将其导入其他服务器(或删除原始表后,在同一服务器上)。