gpt4 book ai didi

mysql - 为什么 RAND() 在 SQL 子查询中搞砸了?

转载 作者:行者123 更新时间:2023-11-29 05:10:26 25 4
gpt4 key购买 nike

我的目标是随机选择一家企业,然后使用该企业的 ID 获取他们的所有广告。我的查询得到了意想不到的结果。返回的广告行数始终是我假设的“SELECT id FROM Business ORDER BY RAND() LIMIT 1”的值。我有 3 个企业,只有 1 个企业有广告行(其中 5 个),但它始终显示同一企业的 5 个广告中的 1-3 个。

SELECT * FROM Advertisement WHERE business_id=(SELECT id FROM Business ORDER BY RAND() LIMIT 1) ORDER BY priority

业务表: Business TABLE

广告表: Advertisement TABLE

广告和业务表的数据:

INSERT INTO `Advertisement` (`id`, `business_id`, `image_url`, `link_url`, `priority`) VALUES
(1, 1, 'http://i64.tinypic.com/2w4ehqw.png', 'https://www.dennys.com/food/burgers-sandwiches/spicy-sriracha-burger/', 1),
(2, 1, 'http://i65.tinypic.com/zuk1w1.png', 'https://www.dennys.com/food/burgers-sandwiches/prime-rib-philly-melt/', 2),
(3, 1, 'http://i64.tinypic.com/8yul3t.png', 'https://www.dennys.com/food/burgers-sandwiches/cali-club-sandwich/', 3),
(4, 1, 'http://i64.tinypic.com/o8fj9e.png', 'https://www.dennys.com/food/burgers-sandwiches/bacon-slamburger/', 4),
(5, 1, 'http://i68.tinypic.com/mwyuiv.png', 'https://www.dennys.com/food/burgers-sandwiches/the-superbird/', 5);

INSERT INTO `Business` (`id`, `name`) VALUES
(1, 'Test Dennys'),
(2, 'Test Business 2'),
(3, 'Test Business 3');

最佳答案

您假设您的查询做了一些它没有做的事情。

(SELECT id FROM Business ORDER BY RAND() LIMIT 1) 未在查询开始时具体化。它对每一行进行评估...因此对于每一行,我们正在测试 business_id 是否与新执行的子查询实例的结果相匹配。更彻底的测试数据(包括不止一项业务)应该可以揭示这一点。

您需要将结果具体化到一个派生表中,然后加入它。

SELECT a.* 
FROM Advertisement a
JOIN (
SELECT (SELECT id
FROM Business
ORDER BY RAND()
LIMIT 1) AS business_id
) b ON b.business_id = a.business_id;

( SELECT ... ) x 构造创建一个仅在查询期间存在的临时表,并使用别名 x。这些表可以像真实表一样连接。

MySQL 将其称为 Subquery in the FROM Clause .

关于mysql - 为什么 RAND() 在 SQL 子查询中搞砸了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40187054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com