我有2个具有相同结构的表:
//gallery
id | user_id | image | type
//gallery_default
id | user_id | image | type | folder
在“ gallery ”表中,我保存了用户上传的图像,并在“ gallery_default ”中保存了来自服务器的预定义图像(图像名称和类似文件夹)。
我想加入2个表,这些表充当具有相同列名和相同类型的表。
示例
(SELECT `image`, '1' AS `t`
FROM `gallery`
WHERE `user_id`='".$u->get('id')."'
AND `type` LIKE 'type1'
ORDER BY RAND() LIMIT 2)
UNION
(SELECT `image`, '2' AS `t`
FROM `gallery`
WHERE `user_id`= '" . $u->get('id') . "'
AND `type` LIKE 'type2'
ORDER BY RAND() LIMIT 2)
UNION
(SELECT `image`, '3' AS `t`
FROM `gallery`
WHERE `user_id` = '" . $u->get('id') . "'
AND `type` LIKE 'type3'
ORDER BY RAND() LIMIT 2)
UNION
(SELECT `image`, '4' AS `t`
FROM `gallery`
WHERE `user_id` = '" . $u->get('id') . "'
AND `type` LIKE 'type4'
ORDER BY RAND() LIMIT 2)
ORDER BY `t` ASC
LIMIT 8
- 这适用于一个“ gallery ”表,但如何添加第二个“ gallery_default ”作为第一个的一部分。
答案 0 :(得分:2)
Perhabs u子查询应该足够了:
SELECT image,
(SELECT image FROM table2 WHERE type LIKE 'typeX' ORDER BY RAND() LIMIT 1) as image2
FROM gallery
WHERE ....
它不是可用的代码,但我认为它显示了很好的方法。
也不要使用这个mysql RAND()
,http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/
根据您的评论: 您应该将两个表合并为一个临时表,从中取出,然后删除它。
类似于:
CREATE TABLE temp AS SELECT * FROM gallery UNION SELECT * FROM gallery_default
要避免重复ID,请立即使用:ALTER TABLE temp drop id;
此时你应该有包含两个表的表temp。 现在,您应该使用查询来获得所需的结果。
然后放弃它:
DROP TABLE temp
答案 1 :(得分:2)
那么,
此查询应该适合您:
SELECT * FROM (
SELECT image, type, 1 AS t FROM gallery
UNION
SELECT image, type, 2 AS t FROM gallery_default ORDER BY RAND()
) AS all_galleries
GROUP BY type, t
我们的想法是将两个结果合并到一个派生表中,然后按类型和结果GROUP
结果。这样可确保每种类型获得2张图片,一张来自galleries
,另一张来自default_galleries
。
希望它有所帮助。