我有两个表,Event
和EventTag
CREATE TABLE event (
id INT PRIMARY KEY,
content TEXT
)
CREATE TABLE event_tag (
event_id INT,
type VARCHAR(255),
value VARCHAR(255)
)
每个事件都有零个或多个标签。我想在SQL中表达的查询是:
将
Event
的所有EventTag.type="foo" and EventTag.value="bar"
(表格中的所有列)与UPDATE TESTTABLE SET TEST_COLUMN= 'Testvalue' WHERE TESTTABLE.TESTTABLE_ID IN (SELECT MASTERTABLE.TESTTABLE_ID FROM MASTERTABLE WHERE ID_NUMBER=11);
相关联。
这对于一个标记标准很容易(例如,使用连接和where,如已回答here),但如何解决两个或多个标准的情况?所以:给我带有相关标签的事件" foo"等于" bar"和(!)一个事件标签" qux"等于" quux"?我想加入标签表' n'时间,但我不确定这是不是一个好主意。
答案 0 :(得分:2)
解决此问题的最佳方法是不使用EAV数据库模型(Entity-Attribute-Value)。你已经遇到了这种反模式的许多问题中的第一个问题。快速谷歌搜索" EAV模型"如果您选择不重新设计,应该为您展示一些其他问题。通常,您的Event
表格应包含foo
列和qux
列。
如果你坚持(或被迫)沿着这条路走下去,你可以使用一种可能的解决方案:
SELECT id, content
FROM Event
WHERE id IN
(
SELECT
E.id
FROM
Event E
INNER JOIN Event_Tag T ON
T.event_id = E.id AND
(
(T.type = 'foo' AND T.value = 'bar') OR
(T.type = 'qux' AND T.value = 'quux')
)
GROUP BY
E.id
HAVING
COUNT(*) = 2
)
如果您将各种类型/值对放入临时表或CTE中,那么您可以JOIN
而不是列出所需的所有对。该语法将依赖于您的RDBMS。
答案 1 :(得分:0)
Select id from EVENT ev
INNER JOIN EVENT_TAG et
ON ev.id = et.event_ID
WHERE et.type = 'foo'
AND et.value = 'bar'
显然,您可以在括号之间放置任何您想要的东西,以找到您想要的任何类型。
答案 2 :(得分:0)
对多个案例/标准使用或操作数
SELECT * FROM Event e join Event_tag on e.eventId = et.eventtagid where ((EventTag.type="foo" and EventTag.value="bar") or (EventTag.type="po" and EventTag.value="yo"))
或者如果值是dyanmic,那么根据您的编程语言接口SQL,您可以编写查询
例如在java中,我可以使用
来完成SELECT * FROM Event e join Event_tag et on e.eventid = et.eventtagid where (EventTag.type=? and EventTag.value=?)
我将上述SQL字符串分配给Query并为其设置参数。