有没有比使用2 SELECT更好的方法?

时间:2013-07-21 01:41:00

标签: mysql sql

假设我有2个表,一个包含用户喜欢的电影条目,另一个包含用户已经去过的事件。每个表都有一列用于了解用户。类似的东西:

表格电影:

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

表事件:

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

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

如果我想从表格电影中选择一些列,而从具有相同iduser的表事件中选择其他列,是否有比2 SELECT更好的方法?我这样说是因为每个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

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

3 个答案:

答案 0 :(得分:2)

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

IF 这两个表具有相似的模式(例如,相同的列名和类型),您可以将两者结合使用:

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

但是,这个不会合理地使用两个具有不同模式的表。

答案 1 :(得分: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 演示

答案 2 :(得分: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行,它将为您的事件提供字段,如果是电影记录,则会填充电影字段。