2013-07-21 51 views
0

假设我有两个表格,一个是用户喜欢的电影条目,另一个是用户已经走过的事件。每个表都有一个用于了解用户的列。类似:有没有比使用2 SELECT更好的方法?

表films:

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

表事件:

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

两个ID用户所用的关系的表与用户的其它信息连接。

如果我想从table电影中选择一些列,并从具有相同iduser的表事件中选择其他列,是否有比2 SELECT更好的方法?我这样说是因为每一个选择都有行diferent号码,以便UNION给我一个错误,并加入给了我这样的:

编辑

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 

EDIT 2

我说只有一个选择因为我认为速度更快,但如果速度更快,请让我知道。

+0

你能否提供一个你想要的输出样本,我不明白为什么你不希望'加入'如果从2个相关表中提取数据。 –

+0

使用内部连接为每个用户获取所有必填字段作为一条记录,并让应用程序处理其余部分。 –

+0

我认为'SELECT * .Films,* .events FROM Films,WHERE iduser ='WHERE events will have – vladkras

回答

1

如果您由于某种原因需要精确地使用,以获取你的数据的一个选择,你可以统一的结果集为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_CONCATdetails列,然后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演示

+0

你认为在一个大型数据库上更快? –

+0

好的重点是你的。 2 SELECT = 2.01 s。 SELECT UNION = 1.03 –

2

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

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

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

然而,这不会有两个表理智地工作不同的模式。

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行,它将为您的事件提供字段,并且如果它是电影记录,则电影字段将被填充。

+0

你的解决方案给了我和我一样的结果 –

相关问题