1

我正在尝试从两个不同的表(forum_posts 和 forum_replies)中获取最新结果...我不确定这样做的最佳方法,所以我尝试使用 UNION ALL 来执行此操作...

我做了一个测试结果,试图确保代码有效;但是,它似乎无法正常工作。即使数据库中有符合要求的数据,它也会显示 No Posts。因此,有关查询的某些内容未正确处理。

$latest = "(SELECT * FROM forum_posts WHERE post_subcat = '1' ORDER BY post_id) UNION ALL (SELECT * FROM forum_replies WHERE reply_subcat = '1' ORDER BY reply_id) LIMIT 1";

if(!$getlatest = $con->query($latest)){ echo 'No Posts'; }

if($getlatest = $con->query($latest)){ echo 'Post'; }

我是工会的新手,所以我有几个问题。

1) 我在 mysql 中看到了一个 union 工作,但他们也可以在 mysqli 中工作吗?

2) 使用联合(联合/联合全部/等)是否有任何限制?列是否必须相同才能进行比较?

3)我在上面的代码中做错了什么吗?我可能只是因为工作太久而忽略了一些小事,只是在这一点上不确定。

4

4 回答 4

1

如果我正确理解了您的需求,我相信以下内容会起作用:

SELECT * FROM forum_posts fp WHERE fp.post_subcat = (SELECT MAX(fp1.post_subcat) FROM forum_posts fp1)
UNION
SELECT * FROM forum_replies fr WHERE fr.reply_subcat = (SELECT MAX(fp.post_subcat) FROM forum_posts fp)
于 2013-06-12T03:03:26.413 回答
1

我在上面的代码中做错了吗?

当然。

首先,您正在运行您的查询两次
其次,您正在检查错误的值以查看是否有任何帖子。http://php.net/mysqli_query

于 2013-06-12T05:23:09.180 回答
1

您通常必须(尽管 DBMS 过于灵活)在您联合在一起的两个查询中具有相同的列类型和标识符,并且order by适用于最终结果集,而不是中间结果集(尽管您可以使用子查询来订购中期结果(如果需要,而不是在这种特定情况下似乎需要的东西)。

所以是这样的:

SELECT post_id as id,
       post_date as dt
    FROM forum_posts
    WHERE post_subcat = '1'
UNION ALL
SELECT reply_id as id,
       reply_date as dt
    FROM forum_replies
    WHERE reply_subcat = '1'
ORDER BY dt DESC
LIMIT 1

mysql/mysqli区别而言,这无关紧要,两种方法最终都会在服务器端完成相关工作。

union all如果您知道没有重复的机会,您通常会使用,以避免对重复删除进行任何不必要的排序。否则,union如果您确实希望删除重复项,请使用。

至于你的代码是否有问题,如果query函数返回 false,你应该检查错误函数的具体失败原因。有关详细信息,请参阅mysqli_error

请记住,如果没有帖子,它不会返回 false,只有在出现错误时才会返回 false。如果查询有效并且没有帖子,您最终会得到一个空的结果集。

于 2013-06-12T02:23:25.717 回答
1

1) 我在 mysql 中看到了一个 union 工作,但他们也可以在 mysqli 中工作吗?

It should work on mysqli also because mysqli is another extension to access Mysql 4.1 onwards

2) 使用联合(联合/联合全部/等)是否有任何限制?列是否必须相同才能进行比较?

Yes. All the columns from two tables needs to be of same data type and the no of columns also should match. I suspect this is your problem.

3)我在上面的代码中做错了什么吗?我可能只是因为工作太久而忽略了一些小事,只是在这一点上不确定。

于 2013-06-12T02:24:32.593 回答