查找表中存在的用户以匹配确切的用户ID

时间:2017-12-28 14:29:38

标签: php mysql

我创建了一个表,其中用户以数组的形式存储。例如,在一篇博客文章中有多个用户标记

+ user_tagged_id + user_id + Status +
|    1, 4, 7     |   6     | Posted |
|     10, 6      |   1     | Posted |
|    11, 4, 1    |   1     | Posted |
|    1, 2        |   3     | Posted |

我正在使用查询来获取user_id列或user_tagged_id列中存在的用户ID的用户,但是使用LIKE它会提取与1匹配的所有id但是如果user_id我希望获得匹配的确切数字在user_tagged_id列中存在= 1,它应该只返回该行并不是全部有意义

SELECT * FROM forums WHERE (status = 'Posted' OR status = 'Reported') 
AND (user_id = '1' OR user_tagged_id IN ('1')) ORDER BY id DESC LIMIT 0, 5

1 个答案:

答案 0 :(得分:1)

要使用LIKE运算符搜索逗号分隔列表,您需要了解可能出现的不同情况:

对于示例,搜索(针)的字符串是 42

  1. 该列表可能只包含一个元素。此元素可能是针,而不是针或包含针的字符串:可能是425142。要找到您要搜索的那个,您可以检查字符串是否相等:user_tagged_id = '42'
  2. 列表可能以针开头,但包含更多元素。这意味着,针后面有一个逗号,但前面没有逗号。为了确保只找到针,而不是另一根针在针上结束或开始 - 如12342425 - 你需要在你的病情中加入连续的逗号,但不是任何先行标志:user_tagged_id LIKE CONCAT('42', ',%')
  3. 列表可能包含针。为了确保没有找到以针开始或结束的字符串 - 如12342425 - ,前两个逗号都需要添加到LIKE条件:{ {1}}
  4. 列表可能以针头结束。为了确保没有找到在针上结束的字符串 - 如user_tagged_id LIKE CONCAT('%, ', '42', ',%') - 前面的逗号需要成为LIKE条件的一部分:3842
  5. 要过滤特定ID的列表,您需要将所有四个条件添加为分离。

    由于这是非常大量加载的,我建议你更愿意创建一个新表来保存用户标记并在查询中user_tagged_id LIKE CONCAT('%, ', '42')