如何按URL或MySQL查询中第一个参数排序?

时间:2019-02-16 23:29:43

标签: php mysql url mysqli parameters

当我运行查询时,它会使标签按随机顺序分组。

这是当前的样子:

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中的什么位置,它们的顺序都相同。

3 个答案:

答案 0 :(得分: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注入敞开了大门。您应该在查询中使用位置参数,并在查询之外传递实际值以防止这种情况。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用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