2012-03-26 11 views
-2

私はテーブル "記事"を持っています。会社のリストまたは記事タイプ - 私は知っているが、私のDBはありません。 :)それぞれのタイプについて nの記事があるとします。私は、タイプの最初の記事(年、または他の基準に基づいて)を選択する必要があります。このようなもの:文字列と制限によるMySQLクエリ

select * from details where (company = 'aaa' or company = 'bbb' or ...) 

私はタイプが何であるか知っているので、ハードコードすることができます。私は各タイプの最初の記事だけを制限する必要があります。ありがとう!私は明確ではなかった場合、私は、行4、7、8

EDIT2

は申し訳ありませんが必要

 
id company copy issue 
------------------------ 
1 apple 'abc' NULL 
2 bmw  'abc' NULL 
3 ibm  'abc' NULL 
4 news  'abc' 2 
5 news  'abc' 3 
6 seagate 'abc' NULL 
7 events 'abc' 1 
8 features 'abc' 5 
9 samsung 'abc' NULL 

EDIT

は、サンプルデータを与えられました。基本的に、この表には2種類のデータが含まれています。 1つは会社情報、もう1つは商品情報です。基本的に私はこれを行う必要があります:

select * from articles where company = "news" order by issue limit 1; 
select * from articles where company = "events" order by issue limit 1; 
select * from articles where company = "features" order by issue limit 1; 

しかし、単一のクエリです。

+0

本当に基準によって異なります。 MySQLでは、単一のクエリでグループ内の最初に一致する行のフィールドのみを選択するのは難しいです。 – gahooa

+0

ソート可能なデータはどこですか? #5の前に行#4を置くのは何ですか?また、#7と#8の区別がつかない。なぜ#1、#2、#3などはありませんか? – Phil

+0

これはデータが入力された方法で、idは自動インクリメントです。それよりも少し複雑ですが、簡単に言うと、それはちょうど異なるIDであると仮定しましょう。 – Alex

答えて

3

ここで、このおそらく

select * from details d 
where company in ('news', 'events', 'features') 
and not exists (
    select 1 from details d_ 
    where d_.company = d.company 
    and d_.id < d.id -- provide your sortable criteria here 
) 

例のようなもの - それから、何か "会社" と "PUBLICATION_DATE" テーブル内の列は "詳細" を仮定しhttp://sqlfiddle.com/#!2/bb8f2/6

+0

会社が混在していることを除いて、これは機能します。 – Alex

+0

@Alex私はMostyの答えをSQLFiddleに追加して、2つを比較することができます。 – Phil

+0

これを回っていくつかの遊びをすると、トリックを行うように見えました。ありがとう! – Alex

0

select * 
from details 
where company in ('aaa', 'bbb', ...) 
and publication_date between '2012-02-01' and '2012-03-01' 
order by publication_date desc 
limit 1 
+0

IN句はまさに私が必要とするものですが、各タイプを最初のものに制限する必要もあります。したがって、クエリが4 'aaa'と7 'bbb'を返す場合は、それぞれに最初のものだけが必要です。 – Alex

3

にこのクエリ:

select t1.* from t t1 
left join t t2 
on t1.company = t2.company and t1.id > t2.id 
where t2.id is null and t1.company in ('news', 'events', 'features') 

が返されます:

 
+----+----------+------+ 
| ID | COMPANY | COPY | 
+----+----------+------+ 
| 4 | news  | abc | 
| 7 | events | abc | 
| 8 | features | abc | 
+----+----------+------+ 

をあなたが探しているものということですか?

注:私は順序があなたがそれをhere

編集再生することができますIDフィールド

によって提供されているとthe first articleを言うとき:あなたの編集後

を、クエリがほとんどです同じですが、注文フィールドをidの代わりにissueに変更してください:

select t1.* from t t1 
left join t t2 
on t1.company = t2.company and t1.issue > t2.issue 
where t2.id is null and t1.company in ('news', 'events', 'features') 
+0

あなたの質問に「t」、「t1」、「t2」とは何ですか?複雑なことを申し訳ありません:それはIDでも日付でも問題はありません。 – Alex

+0

't'はテーブル名です。 't1'と' t2'はテーブルのエイリアスです。私はあなたがいろいろな順序について何を言うのか分からない。私が提供したソリューションは、あなたの期待される結果をもたらします。実際のデータを表示するためにサンプルデータを更新し、これが機能しない理由を確認できますか?ありがとう –

0

group byを実行しようとしています。
次は、order by問題の列になります。
次に、最初の行だけが必要です。

グループコンカットを使用してリストを作成しました。
次に、順序付きリストの最初の文字列を抽出しますgroup_concat(copy order by copy)

select 
    id, 
    company, 
    substring(
    group_concat(copy order by copy), 
    1, 
    case when substring_index(group_concat(copy order by copy),',',1) > 1 
      then substring_index(group_concat(copy order by copy),',',1)-1 
     else 1 end 
    ) as copy 
from details d 
where company in ('news', 'events', 'features') 
group by company 

*リストgroup_concat(copy order by copy)は、あなたのデータによって異なります。

関連する問題