如何组合两个具有相同列名的库

时间:2014-11-21 18:34:28

标签: php mysql

我有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 ”作为第一个的一部分。

2 个答案:

答案 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

希望它有所帮助。