mySQL 从另一个选择的列表中选择
Posted
技术标签:
【中文标题】mySQL 从另一个选择的列表中选择【英文标题】:mySQL select from a list from another select 【发布时间】:2016-07-22 08:43:20 【问题描述】:A 有一张桌子,所以:
编号 |姓名 |身份 |信息 1 |机管局 | | X 2 | BB | | 3 |抄送 | | X 4 | DD | 1 | 5 | EE | 1 | 6 |法郎 | 2 | 7 | GG | 2 | 8 | HH | 3 | 8 | HH | 4 SELECT id FROM table WHERE info LIKE 'x'在 PHP 中
对于第一个请求的每个 id 结果中的 i : SELECT id, name FROM table where idparent = i ORDER BY RAND() LIMIT 1; 结束例如,结果可能是:
4 |DD 8 |HH并且由于 RAND(),结果也可能是:
5 |EE 8 |HH但它不是那么漂亮,有没有可能在一个请求中做到这一点?
我尝试了几个想法,但没有成功,我在这里不一一列举,以免污染我的主题的理解:)
提前感谢您的回答
【问题讨论】:
检查更新的答案。 【参考方案1】:这是一个使用sub-queries
的解决方案,它仅对 MySQL 有效,因为 MySQL 的 GROUP BY
行为是 SQL 标准的扩展。
使用GROUP BY
的MySQL解决方案:
SELECT t.id, t.name
FROM (
SELECT id, name, idparent
FROM table
where idparent IN (SELECT id FROM table WHERE info LIKE 'x')
ORDER BY RAND()
) t
GROUP BY t.idparent;
非 MySQL 的解决方案,通过分配 group rank
和 user variable
:
SELECT *
FROM (
SELECT
id, name, idparent,
IF(idparent = @last_idparent, @grp_rank := @grp_rank + 1, @grp_rank := 1) as grp_rank
FROM table CROSS JOIN (SELECT @grp_rank := 1, @last_idparent := NULL) param
where idparent IN (SELECT id FROM table WHERE info LIKE 'x')
ORDER BY RAND()
) t
WHERE t.grp_rank = 1;
【讨论】:
它有效,我对此感到惊讶,但现在我明白为什么了:***.com/questions/1225144/… 谢谢! 只是好奇,你有其他SQL数据库的解决方案吗,因为“分组依据”的行为只存在于mySQL。 这很容易。我在打电话。一种方法是在内部子查询中为每个组分配1..N,在外部查询中过滤掉1 你能给我一个关于这个想法的例子吗?谢谢! 可能有排名函数(***.com/questions/3333665/rank-function-in-mysql),但是为了使用“IN”,子请求应该只返回一行......【参考方案2】:试试这个:
SELECT id, name FROM table natural join (SELECT id as idparent FROM table WHERE info LIKE 'x') as T ORDER BY RAND() LIMIT 1;
我希望这能解决问题。
【讨论】:
这个命题只返回一行,这是我的尝试之一:/ @user3671363 实际上没有样本数据很难测试。你能发布一个sqlfiddle吗?同时我会尝试找出其他的东西。 @user3671363 只需检查我更新的解决方案,让我知道它是否有效。只是想知道我是否正确......我知道你已经接受了答案。 感谢您的尝试。抱歉,它不起作用,因为 LIMIT 限制了整体的结果而不是 idparent。 @user3671363 所以如果我删除LIMIT 1
会起作用吗?以上是关于mySQL 从另一个选择的列表中选择的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 根据使用数组从另一个下拉列表中的选择动态创建选项