MySQL%LIKE%问题

时间:2014-01-07 08:45:20

标签: php sql

我的数据库是......

**Mytable**
UserID        Orders        Remarks
1         13,17,01,20,19    Done
2          12,18,17,15      Waiting
3                14         Done
4               15,10       Done

我想显示订单的UserID ...示例

  1. $ orders = 15,14 //应该显示2,3,4
  2. $ orders = 15 //应该显示2,4
  3. $ orders = 10,17 //应该显示10,17
  4. $ orders = 17,10 //应该显示10,17
  5. 但是,使用我的sql语句,它会显示以下内容

    1. $ orders = 15,14 //什么都没显示
    2. $ orders = 15 //显示2,4
    3. $ orders = 10,17 //什么都没显示
    4. $ orders = 17,10 //不显示任何内容
    5. 我的sql语句是

      select UserID from MyTable where Orders like %$orders%
      

      我错过了什么?

3 个答案:

答案 0 :(得分:1)

'LIKE'将在该字段中搜索给定子字符串的字符串。所以:

select UserID from MyTable where Orders like %$orders%

'Orders' = '13,17,01,20,19'

'$orders' = '13, 01'

将不匹配,如果这些数字的顺序相同,它将匹配:

'Orders' = '13,01,17,20,19'

要使您的查询有效,请按以下方式进行:

select UserID from MyTable where Orders like %$order1% AND Orders like %$order2% AND Orders like %$order3%

为每个想要匹配的orderid使用一个$ orderx。

更好的解决方法是规范化您的数据库。阅读有关多对多关系的信息,并将您的订单放入新表中。这样,您可以根据需要为每个用户标识提供尽可能多的订单,并仍然使用相同的单个查询选择它们。

答案 1 :(得分:0)

根据您的要求,您必须使用逗号分解$ order字符串并将其转换为数组。并像这样运行一个foreach

$order_array = explode(",", $order);
$like_array = array('0'); // Stop errors when $words is empty
foreach($order_array as $ord){
  $like_array[] = 'Orders LIKE %'.$ord.'%'
}

$sql = 'SELECT UserId FROM MyTable WHERE '.implode(" OR ", $like_array);

执行$ sql。

希望这有帮助。

正如人们在评论中建议的那样,如果你有一个规范化的数据库,这是非常好的。你只是一直保存。你可以在这里找到一个很好的教程。

http://net.tutsplus.com/tutorials/tools-and-tips/relational-databases-for-dummies/

这将是一个很好的开始。

答案 2 :(得分:0)

如果您需要使用LIKE查找订单15的数据,您的表结构可能会出现问题,它将获取115,150,215 1511等数据。所以我建议你改变你桌子的结构。

相关问题