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

而我想做的就是用 mysql/php 做这样的事情:

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 rankuser 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 根据使用数组从另一个下拉列表中的选择动态创建选项

如何从另一个项目列表中过滤一个项目列表?

Excel VBA - 如何从另一个控件触发列表框单击

Laravel/Javascript:在选择不同的选择/下拉列表后填充选择/下拉列表

如何解决这个无效的选择列表?