【问题标题】:mySQL select from a list from another selectmySQL 从另一个选择的列表中选择
【发布时间】: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

但它不是那么漂亮,有没有可能在一个请求中做到这一点?

我尝试了几个想法,但没有成功,我在这里不一一列举,以免污染我的主题的理解:)

提前感谢您的回答

【问题讨论】:

  • 检查更新的答案。

标签: mysql subquery


【解决方案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;

【讨论】:

  • 它有效,我对此感到惊讶,但现在我明白为什么了:stackoverflow.com/questions/1225144/… 谢谢!
  • 只是好奇,你有其他SQL数据库的解决方案吗,因为“分组依据”的行为只存在于mySQL。
  • 这很容易。我在打电话。一种方法是在内部子查询中为每个组分配1..N,在外部查询中过滤掉1
  • 你能给我一个关于这个想法的例子吗?谢谢!
  • 可能有排名函数(stackoverflow.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 会起作用吗?
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多