1

在 Mysql 中,我的查询得到了这种结果

+-id-+-name--+is_active-+---date---+
|  1 | name1 |     1    | 21231321 |
|  3 | name3 |     1    | 11313213 |
|  4 | name9 |     1    | 10313213 |
|  8 | name3 |     1    | 10013213 |
| 54 | name2 |     0    |    0     |
| 9  | name5 |     0    |    0     |
| 11 | name8 |     0    |    0     |

我想从此结果查询中进行多项选择,而无需再次选择此查询。

从上面的结果查询中,我想将这三个条件合二为一

1.Give me first two rows (result query above is sorted by date)
2.Give me one random row where is_active = 1 and not in results in 1.
3.Give me one random row where  is_active = 0

我读过database viewsand stored procedures,但我不知道这是否是最好的方法?

有人可以为此提供我的 MySQL 代码吗?

谢谢

4

1 回答 1

2

对于评论中所述的 50-100 行的小型结果集,PHP 的数组处理工具可以很容易地处理您的要求。假设您的行集在查询输出中排序

ORDER BY 
 date DESC,
 is_active DESC

...您可以使用您使用的任何 API 将所有行提取到 PHP 中的一个数组中:

// To store output:
$results = array();

// Using the appropriate fetch call (assuming an associative array here)
while ($row = $result_resource->fetch()) {
  // append row onto results
  $results[] = $row;
}

// Remove the first 2 - your first requirement:
$first_two = array_splice($results, 0, 2);

$active = array();
$inactive = array();
// Then split the remaining into is_active or not is_active with a loop
foreach ($results as $r) {
  if ($r['is_active'] == 1) {
    $active[] = $r;
  }
  else $inactive[] = $r;
}

// Then you can just call `array_rand()` to get results from those
$rand_active = array_rand($active);
$rand_inactive = array_rand($inactive);

我将再次声明,这一切都取决于行集是否很小。数组和循环的开销可能会小于多次查询调用。但是,如果行集很大,我会使用 3 个单独的查询。

首先:

ORDER BY 
  date DESC
  is_active DESC
LIMIT 2

从该查询中获取行并获取 ID。再次执行:

WHERE
  is_active = 1 
  /* the 2 ids from the first query */
  AND id NOT IN (id1, id2)
ORDER BY RAND()
LIMIT 1

第三个查询:

WHERE is_active = 0
ORDER BY RAND() 
LIMIT 1

所有这三个可以打包到一个UNION ALL查询中,但我会认为只有在性能真的很差的情况下。

于 2013-01-27T13:01:41.463 回答