我想找到一個合適的方式獲取X隨機記錄。另外我想檢查特定記錄的使用情況,所以我不會像其他人一樣經常使用相同的隨機記錄。通過MySQL獲取最少的隨機記錄集
我測試了一套與這3個表,一張表的問題,對於用戶來說一個表,併爲特定用戶所服務的問題一個表。我想用6000個問題來完成這個任務。
CREATE TABLE `questions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`question` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `served` (
`user` int(11) NOT NULL DEFAULT '0',
`question` int(11) NOT NULL DEFAULT '0',
`count` varchar(128) DEFAULT NULL,
PRIMARY KEY (`user`,`question`),
KEY `count` (`count`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nickname` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我發現從問題表中獲取隨機記錄工作得很好的查詢是如下:
SELECT id, question
FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 10
FROM questions
) vars
STRAIGHT_JOIN
(
SELECT q.*,
@lim := @lim - 1
FROM questions q
WHERE (@cnt := @cnt - 1)
AND RAND() < @lim/@cnt
) i
但現在我想結合的服務表,以確保隨機值從最不受歡迎的問題中挑選出來。我想到的查詢是如下:
SELECT id, question, count
FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 10
FROM questions
) vars
STRAIGHT_JOIN
(
SELECT q.*,
s.count,
@lim := @lim - 1
FROM questions q
LEFT JOIN served s
ON s.question = q.id
WHERE (@cnt := @cnt - 1)
AND RAND() < @lim/@cnt
ORDER BY count ASC) i
與此查詢的問題是,它從來沒有給我的10個結果的限制+它從來沒有給我想要的記錄。有誰能把我推向正確的方向嗎?
按照要求一個SQL撥弄一些數據來測試:http://sqlfiddle.com/#!2/3e5ed/5。我預計結果將是10個問題,其中用戶1的「計數」是最少的(或不存在的偏差)。
我已經結束了使用修改後的查詢,它必須是快速:
SELECT q.*, s1.count AS count_a, s2.count AS count_b
FROM questions q
LEFT JOIN served s1
ON (s1.question = q.id AND s1.user = 1)
LEFT JOIN served s2
ON (s2.question = q.id AND s2.user = 2)
WHERE q.categorie = 1
ORDER BY IFNULL(s1.count, 0) + IFNULL(s2.count, 0) + RAND()
LIMIT 10
考慮提供適當的DDLs(和/或一個sqlfiddle)與一小部分合法結果一起 – Strawberry
我添加了一個URL與我的測試數據+我期望我的第二個查詢做什麼。 – Wesley