【问题标题】:IF ELSE mysql query for LIKE operatorLIKE 运算符的 IF ELSE mysql 查询
【发布时间】:2017-07-13 05:19:28
【问题描述】:

我有一个这样的 mysql 查询。

SELECT item FROM items WHERE catid=3 AND tag LIKE '%".$tag[1]."%' OR tag LIKE '%".$tag[2]"%' LIMIT 4

我如何告诉 mysql 首先搜索具有tag LIKE '%".$tag[1]."%' 的项目,然后再继续搜索过程以查找具有tag LIKE '%".$tag[2]."%' 的项目。因为现在看起来mysql随机选择执行什么条件。有时它会显示 4 个结果都匹配 tag LIKE '%".$tag[2]."%',这是我不想要的。我希望mysql首先优先考虑tag LIKE '%".$tag[1]."%'

【问题讨论】:

  • 这是一个不清楚的问题,请您解释一下以便更好地理解。
  • @Mr.Developer 我想告诉 Mysql 在尝试查找具有 tag LIKE '%tag2%' 条件的项目之前先查找具有 tag LIKE '%tag1' 条件的项目。是否可以使用 mysql 查询来做到这一点,或者我需要从 php 中做到这一点?
  • LIKE 是布尔运算符,它可以是TRUEFALSE(或NULL) - 它不能是< 4。请澄清您的问题。
  • 您的意思是从结果集中的数据源中获取 tag1 的前 3 个(或 1 或 2 个,如果少于 3 个)结果和来自 tag2 的其余结果?
  • @Mr.Developer P.Salmon 我已经完善了这个问题。请看一看。谢谢大家!

标签: php mysql


【解决方案1】:

您想对结果进行排序,请在下面尝试

WHERE catid=3 AND `tag` LIKE '%tag%' ORDER BY IF( `tag` LIKE 'tag1%',0, IF( `tag` LIKE '%tag2', 1, 2 ) )

【讨论】:

  • 您确定没有任何 tag2 记录吗?
  • @P.Salmon 对不起,你是什么意思?
  • @P.Salmon 是的,我已编辑,但您的评论是正确的。感谢您的通知 +1
【解决方案2】:

也许像这样使用带有标签1限制的联合

MariaDB [sandbox]> select * from items;
+--------+--------+--------+----------+-----------+
| ITMSTK | ITMQTY | ITMCOG | ITMURN   | ITMSOU    |
+--------+--------+--------+----------+-----------+
| WN778  | 1      |      2 | 12345112 | WEB       |
| WN776  | 1      |      1 | 12345112 | WEB       |
| WN771  | 1      |      2 | 12345112 | WEB       |
| WN845  | 1      |      1 | 22544548 | ADVERT    |
| WN846  | 1      |      1 | 22544548 | ADVERT    |
| WN845  | 1      |     20 | 44848643 | TELEPHONE |
+--------+--------+--------+----------+-----------+
6 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> (SELECT itmsou FROM items WHERE 3=3 AND itmsou LIKE '%web%' limit 2)
    -> union all
    -> SELECT itmsou FROM items WHERE 3=3 AND itmsou LIKE '%advert%'
    -> ;
+--------+
| itmsou |
+--------+
| WEB    |
| WEB    |
| ADVERT |
| ADVERT |
+--------+
4 rows in set (0.00 sec)

【讨论】:

  • 我已经完善了我的问题,请看一下谢谢!
【解决方案3】:

我从other post找到了答案

SELECT item FROM items WHERE catid=3 AND 
   (tag like '%".$tag[1]."%' or tag like '%".$tag[2]."%') order by case 
       when tag like '%".$tag[1]."%' then 1 
       when tag like '%".$tag[2]."%' then 2 
       else 3 
   end 
LIMIT 4

【讨论】:

    【解决方案4】:

    我建议你看看下面:

    select *
       ,case when tag  like '%$keyword1%' then 1
            when tag   like '%$keyword2%' then 2 
        end as [priority]
    from table_name
    where tag   like '%$keyword1%'  or tag   like '%$keyword2%' 
    order by [priority]
    

    这实际上仍然为您提供了关键字 2 的结果,但同时它优先考虑了关键字 1 在顶部。

    或者,您可能对按“相关性”排序而不是通配符搜索感兴趣。

    【讨论】:

    • 你的回答和这个回答有什么区别stackoverflow.com/a/45093695
    • 如果在我的实际同时使用关键字 1 和关键字 2 的情况下找到关键字 1 结果,但对结果进行排序,使用关键字 1 将结果放在顶部
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多