【问题标题】:Get random friends from mysql从mysql获取随机好友
【发布时间】:2013-11-18 11:51:29
【问题描述】:

那里有 2 个 mysql 表 users(id,name,city) 和friend_list(id,userid,friend,status)。

现在我需要从friend_list 表中随机获取三个朋友,并从users 表中获取他们的姓名。

Friend_list table
id |  userid  |friend |status
1  |    1     |   2   | friends
2  |    3     |   1   | friends
3  |    2     |   3   | friends

users table:
id  |  name
1   | xxx
2   | yyy
3   | zzz

我需要这样的查询。

SELECT f.*,u.name FROM friend_list f,users u WHERE (f.userid = 1 or f.friend = 1) AND f.status = 'friends' AND f.userid = u.id AND f.order by RAND() limit 3 

但例如:它应该在 userid 列和朋友列中选择 1。

我试图在不使用 JOIN 的情况下实现它

【问题讨论】:

  • 你试过用rand()函数加入吗??
  • @rockieB :我使用 SELECT f.*,u.name FROM friend_list f,users u WHERE (f.userid = 1 or f.friend = 1) AND f.status = 'friends' AND f.userid = u.id AND f.order by RAND() limit 3 ` 但问题是从用户表中选择名称。如何将选定的行与用户表(f.userid = u.id)和(f.friend = u.id)的id列匹配?

标签: php mysql


【解决方案1】:

您可以使用 rand() 的排序,如下查询。

select Friend_list.friend,users.name from Friend_list inner join users on Friend_list.userid=users.id order by rand();

【讨论】:

    【解决方案2】:

    要选择 2 个随机条目,请尝试:

    SELECT * FROM 
    (
     SELECT * from users join on Friend_list.userid = users.id where users.id = ?
    ) as sub_equity
    ORDER BY RAND() LIMIT 2
    

    我在一个项目上有同样的任务:-)

    【讨论】:

      【解决方案3】:
      SELECT Friend_list.*, users.name
      FROM Friend_list INNER JOIN users ON Friend_list.userid = users.id
      ORDER BY RAND()  // this will show random records
      

      【讨论】:

        【解决方案4】:

        您可以使用ORDER BY RAND() LIMIT 3;

        【讨论】:

          【解决方案5】:

          试试这个:

          SELECT * FROM friend_list f
          INNER JOIN users u ON u.id = f.userid
          ORDER BY rand() LIMIT 1;
          

          SQL FIDDLE:http://sqlfiddle.com/#!2/e483c/1/0

          【讨论】:

            【解决方案6】:

            如果有很多行,ORDER BY RAND() 会很慢。

            如果users.id 是连续的,并且您对 users.id 有统计信息(例如 MAX(users.id)、MIN(users.id)),则在客户端生成三个介于 min、max 之间的随机数。

            以下查询:

            SELECT u.name as person, u2.name as friend_with
            FROM users u
            INNER JOIN friends_list f ON u.id = f.userid
            WHERE users.id IN (random_number1, 2, 3);
            

            这个查询可以使用INDEX,所以比ORDER BY RAND()

            啊.. users.id 不会是连续的(比如用户被删除了),所以你需要生成足够的随机数。

            【讨论】:

              【解决方案7】:

              尝试这样做:

              SELECT u.name as person, u2.name as friend_with
              FROM users u
              INNER JOIN friends_list f ON u.id = f.userid
              INNER JOIN users u2 ON u2.id = f.friend
              WHERE f.userid = 1 or f.friend = 1
              AND f.status = 'friends'
              ORDER BY rand() LIMIT 3;
              

              SQLFIDDLE DEMO

              这将为您获取三个随机记录,其中包含该人的姓名和他的朋友的姓名,作为用户 ID 1 之一

              【讨论】:

              • 我需要不使用联接的结果...查看我的编辑(在结果附近添加了查询)...
              • 您的查询中有隐式连接。我只是明确地使用它们。我更改它以添加用户ID 1的验证。看看它是否是你想要的
              • 如果表中有更多记录,是否会影响查询处理时间。超过 100k 或 1000k 条记录...
              • Random 不是很快,但您最好根据您的数据对其进行测试,看看您是否可以使用它,或者您是否必须尝试不同的方法。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-06-26
              • 2013-04-13
              • 2018-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多