在选择结果之间随机添加记录

时间:2015-02-03 12:51:34

标签: mysql

我想在选择结果中随机添加记录,如下例所示:

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

但是我不想随机记录我只想混合两个表记录,如第一个例子。 我希望我的问题现在清楚了。

1 个答案:

答案 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生成一个随机位置,然后在每一行中我们为它添加一些随机值,根据两个表之间的大小差异,然后在这个列上排序整个结果。