php - 如果列值存在于另一个表中,则对表中的行进行排序

标签 php mysql

我目前正在为我的网站开发一个“搜索引擎”,但我遇到了一些困难。

这是我当前的查询:

SELECT * FROM posts WHERE title like '$query%' ORDER BY  `title` DESC LIMIT 10

表格帖子中有超过 10k 行。

我还有另一个表:已订阅。订阅的表由 2 列组成,post_id 和 post_title。

当用户搜索时,我想向他显示 10 个帖子(与用户搜索关键字相关),首先是他订阅的帖子(以便在订阅表中),然后是其他帖子。如果他订阅了 10 个以上的帖子,则应该显示 10 个订阅的帖子。如果他订阅的帖子少于 10 个(例如 5 个),则应显示这 5 个已订阅的帖子和其他 5 个未订阅的与他的搜索关键字相关的帖子。

我期待着你的回答,

谢谢

最佳答案

首先不清楚为什么您的数据通过在 subscribed 表中包含 post_title 而被非规范化。

现在,假设查询只依赖于 posts 表中的 title 列,您可以利用 UNION ALL 来实现期望的结果:

(
  SELECT 1 subscribed, p.*
    FROM posts p JOIN subscribed s
      ON p.id = s.post_id
   WHERE p.title LIKE 'keyword%'
   ORDER BY title DESC
   LIMIT 10
)
UNION ALL
(
  SELECT 0 subscribed, p.*
    FROM posts p LEFT JOIN subscribed s
      ON p.id = s.post_id
   WHERE s.post_id IS NULL
     AND p.title LIKE 'keyword%'
   ORDER BY title DESC
   LIMIT 10
)
LIMIT 10

这是一个 SQLFiddle 演示

关于php - 如果列值存在于另一个表中,则对表中的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289282/

相关文章:

php - 如何设置时间戳字段中的日期和时间格式

php - 意外的 T_CONCAT_EQUAL

java - 如何在mysql中获取 "x highest value"

php - PHP 的 ExtJS 包装器

php - 如何使用 php 定位 mysql 查询表结果中的特定单元格

java - 如何将mysql数据源添加到applicationContext.xml

php - 根据ID将数据库表数据拆分到不同的数组中

php - 如果查询未返回任何内容,则显示消息

PHP - 提交后保存选择选项值

php - 我需要在mysql中删除之前选择吗? :