数据库布局问题

时间:2011-10-23 15:36:48

标签: mysql database database-design

我会尝试解释这个问题。

我有这个结构:

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 = ?))

当存在多个商品时,如何选择商品,具有相同的商标和相同的所有者?

2 个答案:

答案 0 :(得分:2)

简单回答:如果你的where子句没有按PK列过滤行,则无法从表中检索到一行。

并非100%清楚您想要实现的目标。但是,主键用于唯一标识行。这意味着在这种情况下,您应该在where子句中使用offer_id(在原始问题的insert语句中)。

我猜你前面有一些用户界面 - 为什么你的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而不是标记名称。仅在为最终用户筛选列表时使用描述性属性。否则,请使用主键列。

答案 1 :(得分:1)

你能更具体一点吗?在哪种情况下你执行sql,为什么目的以及给出的参数是什么?也许发布在这些语句前面的代码。 这可以帮助回答你的问题。我现在想知道的是,为什么结果会导致不止一个案件出现问题?