2011-10-23 4 views
0

私は問題を説明しようとします。データベースレイアウトの問題

私はこのような構造を持っている:私は質問の各タイトルがユニークであるStackoverflowのようなシステムを、使用している場合

offers 
-------------- 
id_offer|offer|company 
1 | web programmer| Microsoft 
2 | web programmer| Microsoft 


tags 
-------------- 
id_tags | tags 
1  | php 
2  | js 
3  | asp 


offers_has_tags 
--------------- 
offers_id_offer (fk) | tags_id_tags (fk) 
    1     | 1 
    1     | 2 
    1     | 3 
    2     | 1 
    2     | 2   

、以下のコードに問題はありません。しかし、私は同じタイトルで、同じ所有者で、私はすることができない様々なオファーを持つことができますWHERE offers = ?

私は別のアプローチを特定のジョブを選択する必要があります。同じ所有者が同じタイトルのさまざまなオファーを持つことができるので、タイトルではいけません。所有者+タイトルにすることはできません。

INSERT INTO `offers_has_tags` (
    offers_id_offer, 
    tags_id_tags 
) 
    VALUES (
    (SELECT id_offer FROM offers WHERE offer = ?), //here 
    (SELECT id_tags FROM tags WHERE tags = ?)) 

複数のタイトルと同じ所有者が存在する場合、どのようにオファーを選択できますか?

+0

ここで何をしようとしていますか? – Jon

+1

ここですか?私は助けてもらおうとしています。 – Daniel

+0

StackOverflowの質問が別の質問と同じタイトルを持つことを妨げるものは何もありません。 – ceejayoz

答えて

2

単純な答え:where句がPK列で行をフィルタリングしていない場合、テーブルから正確に1つの行を取得する方法はありません。

達成しようとしていることは100%明確ではありません。ただし、行を一意に識別するために、主キーが使用されます。これは、この場合、where句でoffer_idを使用する必要があることを意味します(元の質問のinsert文で)。

私はこの前にいくつかのUIがあると思います。あなたのUIがオファー名ではなくデータアクセスコードにoffer_idを送信しないのはなぜですか?

しかし、あなたがoffer_has_tagに同じ名前と所有者とのすべてのオファーを挿入したい場合は、(それはT-SQL構文ですが、私の知る限り、それはまた、MySQLの上で動作するはず思い出すことができたように)、これを試してみてください。

INSERT INTO `offers_has_tags` (
    offers_id_offer, 
    tags_id_tags 
) 
SELECT id_offer, (SELECT id_tags FROM tags WHERE tags = ?) 
FROM offers WHERE offer = ? AND company = ?) 

クエリでタグ名の代わりにid_tagsを使用する必要があります。エンドユーザーのリストをフィルタリングする際には、記述属性のみを使用してください。それ以外の場合は、主キー列を使用します。

+0

@ Filip、Dennisに私のコメントを見てください。ありがとう – Daniel

+0

@ダニエル、私はそれらのコメントを読んだだけで、私は答えて大胆な文章のため、あなたを助けることができる誰もが、ごめんなさい。あなたがフィルタリングする値が一意でない場合(そして、それが一意であることを確かめるためにwhere句で使用する列はPKまたはユニークなインデックスでなければなりません)、行を1つだけ取得する方法はありません。あるいは、私はあなたが達成しようとしていることをまだ理解していません。 –

+0

はい、問題です。タイトルは一意にすることはできませんので、どのようにオファーをフィルタリングできますか?多分タイムスタンプ? – Daniel

1

もう少し具体的に教えてください。どのような状況でsqlを実行しているのですか?どの目的のために引数が与えられていますか?おそらく、これらのステートメントの前にあるコードを投稿してください。 あなたの質問に答えるのに役立つかもしれません。私が現時点で疑問に思っていることは、結果として複数のケースを得ることはなぜ問題なのでしょうか?

+0

明確にしてください。同じタイトルを持つ2つのオファーには、同じ所有者が異なるキーワードでタグ付けすることができます。私の例(SQLコード)では、 'where offer =" web programmer "'を実行すると2つの結果が得られるので、同じタグを持つ2つのオファーにタグ付けします。私は何を意味するのですか? – Daniel

+0

実際にはありません。私はまだ答えられていないいくつかの質問をしました。このすべての目的が何であるか把握するのは難しいです。私が今想像しているのは、あなたがウェブサイトを持っているということだけです。特定のタイトルや特定のタグなどのすべての求人情報を表示したいのですか? –

+0

いいえ、基本的にこの段階では、私が欲しいのは、オファーにタグを付けることだけです。ユーザはオファーのタイトルを書き、タグを割り当てる。問題は、独占的に同じ所有者と同じタイトルを持つユニークなオファーを選択することです。サブクエリでどのように選択できますか? – Daniel

関連する問題