1

我有一个表格,其中包含性别编码为 0 和 1 的人。我需要每隔一行选择男性/女性。我以为我可以通过使用模数和性别代码 0 和 1 以某种方式管理这个问题,但我还没有设法弄清楚......

我正在寻找的结果如下所示:

+-----+--------+--------+
| 行 | 性别 | 姓名 |
+-----+--------+--------+
| 1 | 女| 丽莎 |
| 2 | 男| 格雷格 |
| 3 | 女| 玛丽 |
| 4 | 男| 约翰 |
| 5 | 女| 珍妮 |
+-----+--------+--------+

等等

另一种方法是通过合并 2 个单独的数组在 PHP 中完成,但我真的很喜欢它作为 SQL 查询......

任何建议表示赞赏!

4

5 回答 5

2

做两个子查询来选择男性和女性。使用排名函数来枚举它们。

Males:
1 | Peter
2 | John
3 | Chris

Females:
1 | Marry
2 | Christina
3 | Kate

然后按 x10 进行多人游戏排名结果,女性加 5。所以你有这个:

Males:
10 | Peter
20 | John
30 | Chris

Females:
15 | Marry
25 | Christina
35 | Kate

然后执行 UNION ALL 并按新排序顺序/新 ID 排序。

一起应该是这样的(伪代码)

SELECT
Name
FROM
(subquery for Males: RANK() AS sortOrd, Name)
UNION ALL
(subquery for Females: RANK()+1 AS SortOrd, Name)
ORDER BY SortOrd

结果应该是这样的:

Males and Females:
10 | Peter
15 | Marry
20 | John
25 | Christina
30 | Chris
35 | Kate  
于 2012-04-15T12:50:14.043 回答
2

找到Emulate Row_Number()并针对您的情况进行了一些修改。

set @rownum := 0;
set @pg := -1;

select p.name, 
       p.gender
from
  (
    select name,
           gender,
           @rownum := if(@pg = gender, @rownum+1, 1) as rn, 
           @pg := gender as pg 
    from persons
    order by gender
  ) as p
order by p.rn, p.gender

试试SQL Fiddle

注意:从9.4 开始。用户定义的变量

作为一般规则,您永远不应为用户变量赋值并在同一语句中读取该值。您可能会得到预期的结果,但这不能保证。

我将由您决定是否可以使用它。我不使用 MySQL,所以我不能真正告诉你是否应该担心。

于 2012-04-15T13:16:24.280 回答
1

类似于 Mikael 的解决方案,但无需多次订购结果集 -

SELECT *
FROM (
    SELECT people.*,
        IF(gender=0, @mr:=@mr+1, @fr:=@fr+1) AS rank
    FROM people, (SELECT @mr:=0, @fr:=0) initvars
) tmp
ORDER BY rank ASC, gender ASC;

为了避免必须同时订购内部和外部选择,我在内部选择中使用了单独的计数器(@mr - 男性等级,@fr - 女性等级)。

于 2012-04-15T13:34:27.753 回答
0

我有一个表格,其中包含性别编码为 0 和 1 的人员

那你为什么要对结果集中的行顺序做出假设呢?在我看来,将 0/1 转换为“男性”/“女性”要强大得多:

select name, case gender when 0 then 'male' else 'female' end
from Person
于 2012-04-15T12:57:42.800 回答
-1
SELECT alias.*, ROW_NUMBER() OVER (PARTITION BY GENDER ORDER BY GENDER) rnk
FROM TABLE_NAME
ORDER BY rnk, GENDER DESC
于 2018-12-15T13:05:14.967 回答