【问题标题】:SQL - concatenate results from 2 tablesSQL - 连接 2 个表的结果
【发布时间】:2013-09-03 08:23:30
【问题描述】:

首先我需要得到完全匹配

SELECT * FROM movies WHERE title='STRING' ORDER BY x DESC

然后使用 LIKE 匹配追加到这些结果查询

SELECT * FROM movies WHERE title LIKE '%STRING&' AND title<>'STRING' ORDER BY x DESC

并将这些结果限制为最多 10 个结果。

UNION 不会完成这项工作,因为它将所有结果排序在一起并返回错误的顺序(我需要先完全匹配,然后使用 LIKE)

SELECT * FROM movies WHERE title='STRING' UNION
SELECT * FROM movies WHERE title LIKE '%STRING%' ORDER BY x DESC LIMIT 10

我得到的最佳解决方案是使用 multi_query()

$query  = "SELECT * FROM movies WHERE title='STRING' ORDER BY x DESC; ";
$query .= "SELECT * FROM movies WHERE title LIKE '%STRING%' AND title<>'red' ORDER BY x DESC";
$Dbi->multi_query($query);
do {
    $sql = $Dbi->store_result();
    while($x = $sql->fetch_array()) {
        ...
    }
} while($Dbi->next_result());

但在这种情况下,不能在内循环中使用任何 mysql,还必须有更好看的解决方案!

【问题讨论】:

    标签: php sql mysqli append


    【解决方案1】:

    您不需要 UNION,它会访问同一个表两次:

    SELECT *
    FROM movies
    WHERE title LIKE '%STRING&'
    ORDER BY CASE WHEN title='STRING' THEN 1 ELSE 2 END
    LIMIT 10
    

    【讨论】:

    • 只需要在LIMIT 10之前加上, x DESC。我更喜欢这个,因为它使用了 'STRING' 两次,而 @gordon-linoff 解决方案使用了 3 次
    【解决方案2】:
    (SELECT * FROM movies WHERE title='STRING')
    UNION
    (SELECT * FROM movies WHERE title LIKE '%STRING%' ORDER BY x DESC LIMIT 10)
    

    【讨论】:

      【解决方案3】:

      您可以使用order by 子句通过一个查询完成此操作:

      SELECT *
      FROM movies 
      WHERE title like '%STRING%'
      ORDER BY title = 'STRING' desc,
               title like '%STRING%' desc
      LIMIT 10;
      

      ORDER BY 中的第一个子句将完全匹配放在首位。然后第二个按部分匹配排序。 WHERE 子句确保存在某种匹配。

      【讨论】:

      • 只需要在LIMIT 10前加上, x DESC
      猜你喜欢
      • 2022-12-22
      • 2023-03-23
      • 2015-09-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 2012-08-15
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多