假设我有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
我只说一个选择,因为我认为是更快的方式,但如果有更快的方式,请告诉我。
答案 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行,它将为您的事件提供字段,如果是电影记录,则会填充电影字段。