UNION查询的列名上的MySQL唯一标识符

时间:2013-06-12 02:56:11

标签: php mysql

我有两个不同的表共享'is_featured'列。我需要选择所有选中的'is_featured'内容,并按'date_display'desc对结果进行排序。

            PHOTOS

            item_name  |  date_display  |  is_featured
            photo1     |  01-02-13      |  yes
            photo2     |  02-12-13      |  yes
            photo6     |  06-24-12      |  no
            photo23    |  09-24-12      |  no

            VIDEOS

            item_name  |  date_display  |  is_featured
            video5     |  01-14-13      |  no
            video10    |  03-09-13      |  no
            video30    |  03-21-13      |  yes
            video17    |  11-14-12      |  yes


            DESIRED RESULTS - All FEATURED CONTENT Sorted by Date DESC

            item_name  |  date_display  |  is_featured
            video30    |  03-21-13      |  yes
            photo2     |  02-12-13      |  yes
            photo1     |  01-02-13      |  yes
            video17    |  11-14-12      |  yes

我可以使用此UNION查询获得所需的结果:

            SELECT *
            FROM (SELECT item_name, date_display
            FROM photos
            WHERE is_featured='yes'
            UNION
            SELECT item_name, date_display
            FROM videos
            WHERE is_featured='yes'
            ) x
            ORDER BY date_display DESC

我现在需要的是能够为每个表的item_names添加唯一标识符。例如:photos.item_name和videos.item_name。

我的查询可以吗?

我最终需要做以下事情: 如果(item_name来自Photos表){do this}

1 个答案:

答案 0 :(得分:4)

尝试类似:

...
FROM (SELECT item_name, date_display, 'photo' AS media_type
    FROM photos...

和视频子查询类似。这会在结果集中创建一个列media_type,其中包含照片的“照片”和视频的“视频”。

您的结果集如下所示:

        item_name  |  date_display  |  media_type
        video30    |  03-21-13      |  video
        photo2     |  02-12-13      |  photo
        photo1     |  01-02-13      |  photo
        video17    |  11-14-12      |  video

确切地说,如何检查该值取决于您如何处理查询结果,但这里提供了一些类似于Code Igniter的伪代码,用于具体化。您可以根据您的情况调整它:

foreach($query->result() as $row) {
    if ($row->media_type == 'photo') {
        $featured_photos[$row->item_name] = $row;
    }
    else {
        $featured_videos[$row->item_name] = $row;
    }
}

这个例子有点傻,因为它只是在您的查询中撤消了联合的工作,但重点是,一旦您得到结果,您可以使用media_type字段来区分项目的来源。