[英]SELECT random users from MySQL in one row
我正在努力优化查询
(从1个表中选择2个随机用户)
id | name | total | img
------------------------ --
1 user1 500 1
2 user2 600 2
3 user3 650 3
需要结果和ABS(total1 -total2)<200
id1 | id2| name1 | name2 | img1 | img2 | total1 | total2
------------------------ -------------------------------------
1 3 user1 user3 1 3 500 650
为了更好的性能重写这个:
SELECT
C1.id AS id1, C1.img AS img1, C1.name AS name1,
C2.id AS id2, C2.img AS img2, C2.name AS name2,
C1.total AS total1, C2.total AS total2
FROM users C1, users C2
WHERE C1.id <> C2.id
AND ABS(C1.total - C2.total) < 200
ORDER BY RAND()
LIMIT 1
至
$dbh = new PDO ("mysql:host=$hostname;dbname=$dbname","$username","$pw");
$rs = $dbh->query(
"SELECT COUNT(*) AS 'count'
FROM users C1, users C2
WHERE C1.id <> C2.id
AND ABS(C1.total - C2.total) < 200");
$target = rand(0,$rs[0]['count']);
$rs = $dbh->query(
"SELECT
C1.id AS id1, C1.img AS img1, C1.name AS name1,
C2.id AS id2, C2.img AS img2, C2.name AS name2,
C1.total AS total1, C2.total AS total2
FROM users C1, users C2
WHERE C1.id <> C2.id
AND ABS(C1.total - C2.total) < 200
LIMIT ?,1",
array($target));
foreach ($rs as $row)
{
print $row['name1'];
}
返回empry结果,我错过了,与db的连接是正常的(另一个查询正在运行)
要选择两个随机记录,我通常会做一个
// Whatever your query is
order by rand()
limit 2
然后,您可以从这两个随机记录中进行所需的计算。
这是你的解决方案:
SELECT u1.id1, u2.id2, u1.name1, u2.name2, u1.total1, u2.total2, u1.img1, u2.img2
FROM
(
SELECT u.id id1, u.name name1, u.total total1, u.img img1
FROM users u
ORDER BY RAND()
) u1
CROSS JOIN
(
SELECT u.id id2, u.name name2, u.total total2, u.img img2
FROM users u
ORDER BY RAND()
) u2
WHERE u1.id1 != u2.id2 AND ABS(u1.total1 - u2.total2) < 200
LIMIT 0,1;
尝试使用prepare()
和execute()
:
$stmt = $dbh->prepare(
"SELECT
C1.id AS id1, C1.img AS img1, C1.name AS name1,
C2.id AS id2, C2.img AS img2, C2.name AS name2,
C1.total AS total1, C2.total AS total2
FROM users C1, users C2
WHERE C1.id <> C2.id
AND ABS(C1.total - C2.total) < 200
LIMIT ?,1");
$stmt->execute(array($target));
$rs = $stmt->fetchAll();
如何使用单个查询而不是两个:使用减少的rand()
计算
SELECT C1.id AS id1,
C1.img AS img1,
C1.name AS name1,
C2.id AS id2,
C2.img AS img2,
C2.name AS name2,
C1.total AS total1,
C2.total AS total2
FROM(select *, rand() randval from users) C1, users C2
WHERE C1.id <> C2.id AND ABS(C1.total - C2.total) < 200
ORDER BY C1.randval DESC
LIMIT 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.