我会尝试解释这个问题。
我有这个结构:
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 :(得分: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,为什么目的以及给出的参数是什么?也许发布在这些语句前面的代码。 这可以帮助回答你的问题。我现在想知道的是,为什么结果会导致不止一个案件出现问题?