在MySQL中“连接”多个表并按日期格式排序:1319744408

时间:2014-01-17 19:11:02

标签: php mysql join

我一直试图让这个工作几个小时,并尝试了stackoverflow上的几个选项,没有运气。我在这里看到了我认为我需要的东西,但却没有得到它。 我将举例说明我认为应该工作但得到错误:order子句中的'date2'列是不明确的 - 我知道这意味着date2列在多个表中,这是正确的,这就是我想要的。无论如何,这就是我喜欢它的方式:

$sql = "SELECT
            *
        FROM
            videos, games, pics
        ORDER BY
            date2 DESC
        LIMIT 10";

mysql_query($sql) or die(mysql_error());

视频,游戏和视频pics都有一个date2字段,我想为主页订购。 date2字段的格式为1319744408。

我尝试了几件没有运气的事情。有人请帮助我。

2 个答案:

答案 0 :(得分:3)

这是不明确的,因为您在三个表中具有相同的字段名称,但没有指定您尝试按顺序排列的那些(即videos.date2)。

您还遇到的问题是,您目前正在对表中的所有记录进行笛卡尔连接。因此,如果每个表中有100条记录,则在应用限制之前,结果集中最终会有100万条记录(100 * 100 * 100)。您可能无意排序100万行。

您应该指定表之间的连接条件,具体说明您要排序的表和列,并且可能特定于实际需要在结果集中返回的字段,而不是使用SELECT * 。您还需要确保在用于连接或排序的所有字段上都有索引,以便您的查询可以更有效地运行。

如果您的目的是简单地从这些表中获取最新时间项的列表,并且表本身彼此不相关,则可能需要使用UNION。

$query = '(SELECT * FROM videos)
UNION
(SELECT * FROM games)
UNION
(SELECT * FROM pics)
ORDER BY date2 DESC
LIMIT 10';
$r = mysql_query($query);

在这种情况下,date2不会含糊不清。如果表没有缩进的列/列类型,实际上可能会强制您指定要从每个表中选择的列。 UNION将要求每个SELECT语句返回相同数量的列,每列中具有相同的数据类型。

我还建议你开始考虑使用mysqliPDO而不是弃用的mysql_*函数。

答案 1 :(得分:1)

使用LEFT JOIN或其他显式联接在这里会更好,但对于手头的问题:

将表格消除歧义如下:

SELECT * FROM videos, games, pics ORDER BY videos.date2 DESC LIMIT 10