【发布时间】:2017-06-30 00:36:29
【问题描述】:
我有一个 mysql 表,其中用户有一个列有最喜欢的游戏。 它们是这样保存的:
id username games
1 user1 ,game1, game2, game3
2 user2 ,game2, game4
3 user3 ,game4, game1, game3
现在我想选择所有与我至少有一款游戏相同的用户。
$mygames = ,game2, game5
$statement = $pdo->prepare("SELECT * FROM users WHERE games = ?????");
$statement->execute();
$users = $statement->fetchAll();
它应该给我 user1 和 user2 因为两者都包含 game2 和我也! 我该怎么做?
感谢您的帮助:)
【问题讨论】:
-
将游戏存储为 csv 是一个糟糕的设计。将它们存储为单独的多行,可以更轻松地进行这些类型的搜索。
-
由于您的数据模型违反了关系数据库设计背后的理念,您现在遇到了一个问题,使查询变得非常复杂和昂贵。我建议您重新设计数据并将游戏移动到单独的关系表中。这样,您的查询将变得像一个简单的 WHERE 子句一样简单。
-
@arkascha - 是和否... MySQL 5.7 支持 JSON 字段类型,postgre 也是如此。这打破了关系数据库设计的规则。取决于您存储的数据以及您将如何查询 - 那么上述实现可能就完全没问题了。为了连接和增加不必要的复杂性而添加连接是没有意义的。例如如果表很小。此外,有时,不完全标准化可能更有效。
-
@Gravy 我不想争论每一种情况。但请注意,OP 存储的是 not json,它是类似于 csv 数据的半熟的东西。这不是有效的尤其是在 OP 所处的情况下。
-
@arkascha - 我同意你的看法。但是您不知道 OP 从哪里获得数据,这不是问题的一部分。顺便说一句,我也赞成你的评论。
标签: php mysql string select pdo