2011-10-23 60 views
0

我会尽力解释这个问题。数据库布局问题

我有这样的结构:

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   

如果我使用像Stackoverflow,其中问题的每个标题都是独一无二的系统,没有与下面的代码没有问题。但如果我可以有相同的标题,并拥有相同的所有者,我不能做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列过滤行,则无法从表中检索到完全一行。

这是不是100%清楚你想要达到什么。但是,主键用于唯一标识行。这意味着在这种情况下,您应该在where子句中使用offer_id(在原始问题的插入语句中)。

我想你在这之前有一些用户界面 - 为什么你的用户界面不会将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,请看我对丹尼斯的评论。谢谢 – Daniel

+0

@丹尼尔,我刚刚阅读了这些评论,我很抱歉,但没人能帮助你,因为我的答案中用粗体显示了这句话。如果您筛选的值不唯一(并确保它是唯一的,您在where子句中使用的列必须位于PK或唯一索引中),那么只能获取一行。或者我仍然不明白你想达到什么目的。 –

+0

是的,这是问题所在。标题不可能是唯一的,那么我如何筛选该优惠?也许时间戳? – Daniel

1

你能更具体一点吗?在哪种情况下,你是否正在执行sql,为此目的以哪种方式提供参数?也许发布这些语句前面的代码。 这可以帮助回答你的问题。我现在想知道的是,为什么要得到多个案例成为问题?

+0

澄清。具有相同标题的两个优惠,具有相同所有者,可以使用不同的关键字进行标记在我的例子(SQL代码),如果我做'WHERE offer =“网络程序员”',我会得到两个结果,所以我会用相同的标签标记两个提议。你明白我的意思吗 ? – Daniel

+0

不是。我问了一些还没有回答的问题。很难弄清楚这一切的目的是什么。我现在唯一想象的是,你有一个网站,你想显示所有的工作提供一个特定的标题和特定的标签或东西? –

+0

不。基本上在这个阶段,我唯一需要的是标记优惠。用户编写报价标题并分配标签。问题仅限于选择可以拥有相同所有者和相同标题的独特报价。我怎样才能在子查询中选择它? – Daniel