1

私はこのようなテーブルを持っています

id  |  eventid   |  category  | type
----+------------+------------+------
1   |      1     |  music     | event
2   |      2     |  music     | event
3   |      3     |  music     | event
4   |      4     |  music     | event
5   |      5     |  music     | page
6   |      6     |  music     | page

ここで、ステータス イベントを含むテーブルから 2 つ、ステータス ページを含むテーブルから 2 つの 4 つのレコードのデータを取得する必要があります。

例:

id  |  eventid   |  category  | type
----+------------+------------+------
1   |      1     |  music     | event
2   |      2     |  music     | event

5   |      5     |  music     | page
6   |      6     |  music     | page

以下のクエリを試してみましたが、エラーが発生しています

SELECT * 
FROM event_subcategory
WHERE category =  'music'
AND TYPE =  'event'
LIMIT 2 
UNION 
SELECT * 
FROM event_subcategory
WHERE TYPE =  'page'
LIMIT 2 
4

2 に答える 2

0

で使用する場合LIMITUNION、サブクエリを括弧で囲むことをお勧めします。これにより、正しい選択を確実に制限できます。括弧を使用しないと、2 番目のサブクエリがLIMIT両方のサブ選択に適用されます。これは、あなたが望んでいると思うように機能します。

(SELECT * FROM event_subcategory WHERE category = 'music' AND TYPE = 'event' LIMIT 2)
UNION     
(SELECT * FROM event_subcategory WHERE TYPE = 'page' LIMIT 2)

テストする SQLfiddle

(補足として、WHERE category = 'music'2 つの部分は完全に独立しているため、2 番目のサブクエリにも追加することをお勧めします)

于 2013-03-07T06:47:47.540 に答える
0

このクエリを試すことができます

SET @level = 0;
SET @group = '';

SELECT 
        id,
        eventid,
        category,
        typ
FROM (
    SELECT 
        id,
        eventid,
        category,
        type,
        @level := IF(@group = type, @level+1, 1) AS level, 
        @group := type as EGroup 
    FROM event_subcategory
    ORDER BY `type`
) rs
WHERE level < 3 

これにより、各グループから 2 つのレコードが選択されます。内部クエリ内に where 条件を配置できます。ユニオンを使用すると、このように呼び出すことができます

(SELECT * FROM event_subcategory WHERE `TYPE` = 'event' LIMIT 2)
UNION ALL
(SELECT * FROM event_subcategory WHERE `TYPE` = 'page' LIMIT 2)
于 2013-03-07T06:48:34.693 に答える