SQL:在不同的表中查找具有匹配条件的条目

时间:2016-07-05 13:16:42

标签: sql multiple-tables

我有两个表,EventEventTag

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'时间,但我不确定这是不是一个好主意。

3 个答案:

答案 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并为其设置参数。