我想在选择结果中随机添加记录,如下例所示:
1 a
2 a
- b
3 a
- b
4 a
5 a
6 a
- b
7 a
8 a
- b
在一个简单的查询中,我从一个表中选择,但在这种情况下,我希望结果混合b表没有随机结果,否则我只需要将它们联合起来然后命令random()。
编辑:
-- ----------------------------
-- Table structure for t1
-- ----------------------------
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
INSERT INTO `t1` VALUES ('1', 'a');
INSERT INTO `t1` VALUES ('2', 'a');
INSERT INTO `t1` VALUES ('3', 'a');
INSERT INTO `t1` VALUES ('4', 'a');
INSERT INTO `t1` VALUES ('5', 'a');
INSERT INTO `t1` VALUES ('6', 'a');
INSERT INTO `t1` VALUES ('7', 'a');
INSERT INTO `t1` VALUES ('8', 'a');
INSERT INTO `t1` VALUES ('9', 'a');
INSERT INTO `t1` VALUES ('10', 'a');
-- ----------------------------
-- Table structure for t2
-- ----------------------------
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `t2` VALUES ('1', 'b');
INSERT INTO `t2` VALUES ('2', 'b');
INSERT INTO `t2` VALUES ('3', 'b');
所以我可以联合两个表然后随机排序,结果将是这样的:
SELECT
t1.ID,
t1.name
FROM
t1
UNION ALL
SELECT
t2.ID,
t2.name
FROM
t2
ORDER BY RAND();
5 a
2 a
6 a
3 a
7 a
2 b
9 a
1 a
10 a
3 b
4 a
8 a
1 b
但是我不想随机记录我只想混合两个表记录,如第一个例子。 我希望我的问题现在清楚了。
答案 0 :(得分:0)
我不认为纯SQL是最好的解决方案,我会在某个端框架(我不知道你使用的是什么),比如PHP,Delphi,Java等。这种方式更容易,你可以更好地控制它。但是如果你想在SQL中这样做,这里有一个想法:
SET @max_t1 = (SELECT MAX(ID) FROM t1);
SET @max_t2 = (SELECT MAX(ID) FROM t2);
SET @last_order = RAND()*@max_t1/@max_t2;
SELECT
t1.ID, t1.name, t1.ID AS "Ord"
FROM
t1
UNION ALL
SELECT
t2.ID, t2.name, @last_order:=@last_order+RAND()*@max_t1/@max_t2
FROM
t2
ORDER BY Ord
这样我们为TableB生成一个随机位置,然后在每一行中我们为它添加一些随机值,根据两个表之间的大小差异,然后在这个列上排序整个结果。