English 中文(简体)
仅使用一个选择的随机排序子询问组重写群集
原标题:Rewrite a group-by over a randomly-ordered sub-query using only one select

在这里,我有三张桌子,我要问这个问题:

select t.nomefile, t.tipo_nome, t.ordine
from
(select nomefile, tipo_nome, categorie.ordine
from t_gallerie_immagini_new as immagini
join t_gallerie_new as collezioni on collezioni.id=immagini.id_ref
join t_gallerie_tipi as categorie on collezioni.type=categorie.id
order by RAND()
) as t
group by t.tipo_nome
order by t.ordine

它适用于3个表格, 全部在关系 1- N 中, 需要合并, 然后取一个随机结果 。 这个查询工作很好, 问题在于我被要求重写这个查询 : “ 仅使用一个 select < / strong ” 。 我用另一种方法只选择一个, 问题是, 根据 SQL 罪责, 组必须先于 ORDER, 所以在您已经拥有较高表格中每个值的第一个记录时, 随机订购是没有意义的 。

有人知道如何只用一个选择来写入此查询吗?

最佳回答

我无法理解重写此查询请求背后的原因, 然而,我发现有一个解决方案, 只能使用一次“ 选择” 字。 这里的查询 :

SELECT g.type, SUBSTRING_INDEX(GROUP_CONCAT(
i.nomefile ORDER BY
RAND()), , ,1) nomefile
FROM t_gallerie_new g JOIN t_gallerie_immagini_new i ON g.id=i.id_ref
GROUP BY g.type;

任何对此问题感兴趣的人。

注意: Group_ CONCAT 的用途有几个缺点: 使用中/ 大表格时不建议使用此关键字, 因为它可以增加服务器侧载荷。 另外, Group_ CONTACT 返回的字符串的大小有限制, 默认为 1024, 因此, 有必要修改 MySql 服务器中的参数, 才能从此指令中接收更大的字符串 。

问题回答

一般来说,如果我没有大错的话, 类似查询的子解密中 < code> ORDER by 条款与一种技术有关, 允许您按照指定的顺序( 在外部查询中) 逐列地拉出非GROUP 。 因此您可能在这里运气不好, 因为这意味着子查询对于这个查询很重要 。

因为在这个特定情况下,选择的顺序是 BY RAND () ,而不是用特定的列/列集来选择,所以通过在同一级别上进行组合和组合,你可能拥有非常粗略的等同,例如:

select nomefile, tipo_nome, categorie.ordine
from t_gallerie_immagini_new as immagini
join t_gallerie_new as collezioni on collezioni.id=immagini.id_ref
join t_gallerie_tipi as categorie on collezioni.type=categorie.id
group by tipo_nome
order by categorie.ordine

虽然您必须理解为什么这是 non 完全等效。 事实是, MySQL 允许您在一组中按逐项逐列地拉出非GROUP, 但是如果它们不与分组逐栏地连接, 那么返回的数值将是... no, 不是 random 。 在另一方面, 第一段中提到的技术利用了以下事实,即如果明确和毫不含糊地命令排列行设置 < em>, 那么按列排列的非GROUP值将总是相同的 。 因此, < a > 手册 < a > 是 < em> 确定 < / em > 。 在行之前, “ 明确排序 / declimate the facts to befirm between.

现在您可能可以看到差异。 原始版本会明确命令行。 即使它为 < code> by RAND () , 也是有意的, 以确保( 尽可能) 多数时间的产出结果不同。 但修改后的版本是明确命令的“ robbbed ”, 因此您可能会在一行中获得相同的执行结果, 即使它们属于“ 随机性 ” 。

因此,总的来说,我认为你的问题由于上述原因无法解决,如果你选择使用建议修改的版本,那么就应该意识到,它的行为可能与原版本略有不同。

顺便说一句,该技术可能没有很好地记录下来,而且可能已经从经验上找到,而不是从手册上找到。





相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

php return a specific row from query

Is it possible in php to return a specific row of data from a mysql query? None of the fetch statements that I ve found return a 2 dimensional array to access specific rows. I want to be able to ...

Character Encodings in PHP and MySQL

Our website was developed with a meta tag set to... <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> This works fine for M-dashes and special quotes, etc. However, I ...

Pagination Strategies for Complex (slow) Datasets

What are some of the strategies being used for pagination of data sets that involve complex queries? count(*) takes ~1.5 sec so we don t want to hit the DB for every page view. Currently there are ~...

Averaging a total in mySQL

My table looks like person_id | car_id | miles ------------------------------ 1 | 1 | 100 1 | 2 | 200 2 | 3 | 1000 2 | 4 | 500 I need to ...