Php 有没有办法在sql查询中返回多个不相关的结果?
我试图在我的网站上创建一个“feed”系统,在那里发布用户帖子上的活动。为了有效地执行此操作并按日期排序所有活动,我需要将所有内容都放在一个巨大的查询中(除非有其他有效方法)。我的问题是,我当前的“feed”页面有多个ajax调用来获取所有不同的数据,例如用户帖子上的评论或用户开始辩论时的投票。有没有一种方法可以组合不相关的查询以返回多个结果?例如,我可以将这两个查询合并为一个查询吗? 问题1: 问题2:Php 有没有办法在sql查询中返回多个不相关的结果?,php,mysql,sql,Php,Mysql,Sql,我试图在我的网站上创建一个“feed”系统,在那里发布用户帖子上的活动。为了有效地执行此操作并按日期排序所有活动,我需要将所有内容都放在一个巨大的查询中(除非有其他有效方法)。我的问题是,我当前的“feed”页面有多个ajax调用来获取所有不同的数据,例如用户帖子上的评论或用户开始辩论时的投票。有没有一种方法可以组合不相关的查询以返回多个结果?例如,我可以将这两个查询合并为一个查询吗? 问题1: 问题2: SELECT polls.poll_id, polls.title, polls.idUs
SELECT polls.poll_id, polls.title, polls.idUsers, polls.date, users.uidUsers, profileimages.image
FROM polls JOIN
users JOIN
profileimages
ON polls.idUsers = users.idUsers AND profileimages.idUsers = users.idUsers
WHERE polls.idUsers = '$following'
ORDER BY polls.date ASC";
是的,你能做到
但是像我使用的那样的内部连接会产生很多不想要的结果
所以您应该使用phpmyadmin或workbench
运行一个这样的查询,看看它是否给出了正确的结果。
如果没有,您必须将其分组或添加更多where条件
SELECT
t1.article_id
,t1.title
,t1.idUsers
, t2.poll_id
, t2.title
, t2.idUsers
, t2.date
, t1.uidUsers
, t2.image
FROM
(SELECT
articles.article_id
, articles.title
, articles.date
, articles.idUsers
, users.uidUsers
, profileimages.image
FROM
articles
JOIN users
JOIN profileimages
ON articles.idUsers = users.idUsers AND profileimages.idUsers = users.idUsers
WHERE articles.idUsers = '$following' AND articles.published = 'yes'
ORDER BY articles.date ASC) t1
inner join
(SELECT
polls.poll_id
, polls.title
, polls.idUsers
, polls.date
, users.uidUsers
, profileimages.image
FROM
polls
JOIN users
JOIN profileimages
ON polls.idUsers = users.idUsers AND profileimages.idUsers = users.idUsers
WHERE polls.idUsers = '$following'
ORDER BY polls.date ASC) t2
on t1.uidUsers = t2.uidUsers
ORDER BY t2.date;
我将创建一个union all,并在每个查询结果上添加一个新列“type”
SELECT
articles.article_id as id,
articles.title as title,
articles.date as date,
articles.idUsers as idUsers,
users.uidUsers as uidUsers,
profileimages.image as image,
'article' as type
FROM articles
JOIN users ON articles.idUsers = users.idUsers
JOIN profileimages on profileimages.idUsers = users.idUsers
WHERE articles.idUsers = '$following' AND articles.published = 'yes'
union all
SELECT
polls.poll_id as id,
polls.title as title,
polls.date as date,
polls.idUsers as idUsers,
users.uidUsers as uidUsers,
profileimages.image as image,
'pool' as type
FROM polls
JOIN users ON polls.idUsers = users.idUsers
JOIN profileimages ON profileimages.idUsers = users.idUsers
WHERE polls.idUsers = '$following'
然后,您可以创建一个超级选择,以便根据需要对结果进行排序
select * from (
SELECT
articles.article_id as id,
articles.title as title,
articles.date as date,
articles.idUsers as idUsers,
users.uidUsers as uidUsers,
profileimages.image as image,
'article' as type
FROM articles
JOIN users ON articles.idUsers = users.idUsers
JOIN profileimages on profileimages.idUsers = users.idUsers
WHERE articles.idUsers = '$following' AND articles.published = 'yes'
union all
SELECT
polls.poll_id as id,
polls.title as title,
polls.date as date,
polls.idUsers as idUsers,
users.uidUsers as uidUsers,
profileimages.image as image,
'pool' as type
FROM polls
JOIN users ON polls.idUsers = users.idUsers
JOIN profileimages ON profileimages.idUsers = users.idUsers
WHERE polls.idUsers = '$following'
) query order by query.type, query.date
性能通常与全表扫描有关。确保正确创建了所有索引,并记住在where子句中使用它。
在结果太多的情况下,考虑实现查询分页。
可以在<代码>结合< < /代码> ING之前<代码>联合所有< /代码>,因为连接非常相似:
SELECT ap.article_id, ap.title, ap.date, ap.idUsers,
u.uidUsers, pi.image
FROM ((SELECT a.article_id, a.title, a.date, a.idUsers
FROM articles a
WHERE a.idUsers = '$following' AND a.published = 'yes'
) UNION ALL
(SELECT p. poll_id, p.title, p.date, p.idUsers
FROM posts p
WHERE p.idUsers = '$following'
)
) ap JOIN
users u
ON ap.idUsers = u.idUsers JOIN
profileimages pi
ON pi.idUsers = u.idUsers
ORDER BY ap.date ASC;
注意$following
应作为参数而不是字符串传入。请参阅
SELECT ap.article_id, ap.title, ap.date, ap.idUsers,
u.uidUsers, pi.image
FROM ((SELECT a.article_id, a.title, a.date, a.idUsers
FROM articles a
WHERE a.idUsers = '$following' AND a.published = 'yes'
) UNION ALL
(SELECT p. poll_id, p.title, p.date, p.idUsers
FROM posts p
WHERE p.idUsers = '$following'
)
) ap JOIN
users u
ON ap.idUsers = u.idUsers JOIN
profileimages pi
ON pi.idUsers = u.idUsers
ORDER BY ap.date ASC;