1

性別が 0 と 1 にコード化された人物を含むテーブルがあります。1 行おきに男性/女性として選択する必要があります。modulo と性別コード 0 と 1 を使用して何とかこれを管理できると思っていましたが、まだ理解できていません...

私が探している結果は次のようになります。

+-----+--------+---------+
| | 行 | 性別 | 名前 |
+-----+--------+---------+
| | 1 | 女性 | リサ | リサ |
| | 2 | 男性 | グレッグ |
| | 3 | 女性 | メアリー |
| | 4 | 男性 | ジョン | ジョン |
| | 5 | 女性 | ジェニー |
+-----+--------+---------+

別の方法は、2 つの個別の配列をマージして PHP で行うことですが、SQL クエリとして使用したいのですが...

どんな提案でも大歓迎です!

4

5 に答える 5

2

男性と女性を選択するために 2 つのサブクエリを実行します。それらを列挙するには、ランキング機能を使用します。

Males:
1 | Peter
2 | John
3 | Chris

Females:
1 | Marry
2 | Christina
3 | Kate

次に、マルチプレイランキング結果を10倍し、女性の場合は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 フィドルを試す

注: 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 に答える