在这些表中
[ 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代码中,我echo
列title
值DISTINCT
然后我将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 ]
答案 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
将其导入其他服务器(或删除原始表后,在同一服务器上)。