0

假设我有 2 张表,一张包含用户喜欢的电影条目,另一张包含用户去过的事件。每个表都有一个用于了解用户的列。就像是:

表膜:

id | iduser | film | number of watches | note ....

表事件:

id | iduser | event | date | ....

两个 iduser 都与包含用户其他信息的表的关系相关联。

如果我想从具有相同 iduser 的表电影中选择一些列,而从表事件中选择其他列,有没有比 2 SELECT 更好的方法?我这样说是因为每个选择都有不同的行数,所以 UNION 给了我一个错误,而 join 给了我这样的信息:

编辑

FILM   | NOTE |     EVENT     | DATE
-----------------------------------------
tlor   |  9  | going to park  | 20/7/12
tlor   |  9  | eat a sandwich | 5/9/10
B film |  7  | going to park  | 20/7/12
B film |  7  | eat a sandwich | 5/9/10

编辑 2

我只说一个选择,因为我认为这是更快的方式,但如果有更快的方式,请告诉我。

4

3 回答 3

2

执行两个 SELECT 是正确的解决方案。您正在加载两组不同的数据。

如果这两个表具有相似的架构(例如,相同的列名和类型),您可以使用以下方式组合两者:

SELECT * FROM table1 WHERE userid = ? UNION SELECT * FROM table2 WHERE userid = ?

但是,这不适用于具有不同架构的两个表。

于 2013-07-21T01:44:16.393 回答
1

如果您出于某种原因需要仅使用一个 SELECT 来获取数据,您可以UNION ALL像这样统一您的结果集

SELECT 'film' type, iduser, film name, watches, note, NULL date
  FROM films
 WHERE iduser = ?
UNION ALL
SELECT 'event' type, iduser, event name, NULL, NULL, date
  FROM events
 WHERE iduser = ?

另一种一次性获取所有数据的方法是将特定表的特定列值打包GROUP_CONCAT到一details列中,然后explode在客户端代码中

SELECT 'film' type, iduser, film name, GROUP_CONCAT(CONCAT_WS('|', watches, note)) details
  FROM films
 WHERE iduser = 1
 GROUP BY iduser, film
UNION ALL
SELECT 'event' type, iduser, event name, GROUP_CONCAT(CONCAT_WS('|', date)) 
  FROM events
 WHERE iduser = 1
 GROUP BY iduser, event

这是SQLFiddle演示

于 2013-07-21T01:48:10.523 回答
0

除了其他人提到的 UNION 之外,您还可以使用多个 LEFT JOINS 来执行此操作。

就像是

SELECT U.UID, F.FIELD1, E.FIELD1
    FROM USERS U
    LEFT JOIN EVENTS E ON U.USERID=E.USERID
    LEFT JOIN FILMS F ON U.USERID=F.USERID
    WHERE F.USERID IS NOT NULL OR F.USERID IS NOT NULL

类似的东西可以根据您的要求工作。这样,如果该行是 EVENT 行,它将包含您的事件的字段,如果它是电影记录,则将填充电影字段。

于 2013-07-21T01:51:15.183 回答