【问题标题】:How to ORDER BY which ever Parameter comes first in the URL or MySQL query?如何排序 URL 或 MySQL 查询中哪个参数首先出现?
【发布时间】:2019-07-10 17:45:17
【问题描述】:

当我运行查询时,它会以随机顺序对标签进行分组。

这是目前的样子:

https://www.example.com/app/user-images.php?tags=peace&tags2=dogs&tags3=aesthetic

图片 #1 - 和平

图片 #2 - 和平

图片 #3 - 狗

图片 #4 - 狗

图片#5 - 审美

图片 #6 - 和平

预期结果:

图片 #1 - 和平

图片 #2 - 和平

图片 #3 - 和平

图片 #4 - 狗

图片 #5 - 狗

图片 #6 - 审美

有没有办法可以做到这一点?第一个标签是和平,第二个是狗,第三个是基于 URL 的审美。这是我的代码:

$tags = $_GET['tags'];
$tags2 = $_GET['tags2'];
$tags3 = $_GET['tags3'];

$fetch = mysqli_query($conn, "SELECT * FROM users JOIN user_images ON users.username = user_images.username WHERE tags = '$tags' OR tags = '$tags2' OR tags = '$tags3' ORDER BY user_images.tags ASC"); 

我尝试使用ORDER BY user_images.tags ASC,但这并没有真正的帮助,因为无论我将标签放在 URL 的哪个位置,它们的顺序都是相同的。

【问题讨论】:

  • order by tags = '$tags', tags = '$tags2', tags = '$tags3'
  • @Moob 谢谢,这几乎可以工作,但由于某种原因它正在倒退。第三个标签在前,第一个在第三。
  • 降序排列。例如:order by tags = '$tags' desc, tags = '$tags2' desc, tags = '$tags3' desc
  • 嘿@Moob :这是一个不错的解决方案,我相信您应该将其发布为答案。
  • @GMB 你是对的。我已经发布了我的解决方案作为答案。

标签: php mysql url mysqli parameters


【解决方案1】:

您可以按多个标准进行排序,因此在这种情况下,将您的搜索词添加到排序中应该可以工作。例如:

...
ORDER BY tags = '$tags' DESC, tags = '$tags2' DESC, tags = '$tags3' DESC

【讨论】:

    【解决方案2】:

    想到的第一个想法是做 3 个单独的查询,每个标签一个:

    $results = [];
    foreach ([$tags, $tags2, $tags3] as $tag) {
        $fetch = mysqli_query($conn, "SELECT * FROM users JOIN user_images ON users.username = user_images.username WHERE tags = '$tag'");
        while ($row = $fetch->fetch_assoc())
            $results[] = $row;
        $fetch->close();
    }
    

    虽然此代码可能有效,但它为 SQL 注入 敞开了大门。您应该在查询中使用位置参数并在查询之外传递实际值以防止这种情况发生。

    【讨论】:

    • 非常感谢,但我在代码中遇到了这个错误:Warning: array_merge(): Argument #1 is not an array。没见过array_merge,好像很有意思。
    • @radu a UNION 可以在这里工作。
    • @LaneyWilliams 你是对的,mysqli_query() 返回一个对象,所以你必须先提取结果才能合并它们。我已经编辑了我的答案并用实际有效的东西替换了代码。我很抱歉一开始没有检查它。
    • @Moob 我完全同意“UNION”也可以。性能总是有争议的,但有时多个简单查询比单个更复杂的查询更快。在这种情况下,最终需要将所有结果提取到 PHP 中。另一方面,如果结果需要限制/偏移,那么 UNION 肯定更好。
    【解决方案3】:

    您可以使用CASE 表达式来控制您的排序,按顺序为每个标签分配优先级:

    SELECT * 
    FROM users 
    JOIN user_images ON users.username = user_images.username 
    WHERE tags = '$tags' OR tags = '$tags2' OR tags = '$tags3' 
    ORDER BY CASE WHEN tags = '$tags' THEN 1
                  WHEN tags = '$tags2' THEN 2
                  WHEN tags = '$tags3' THEN 3
                  END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多