我的表单有多个选择下拉列表。用户可以在选择中选择多个选项。选择的名称是array[]
;用php我叫implode(",",$array)
在mysql db中,当我想显示这些字段时,它会将该字段存储为此格式的文本"places"= "new york, toronto, london"
。
我正在尝试运行报告来显示地点。这是我的选择:
"select * from mytable where db.places .. userSelectedPlaces"
如何在用户选择的“地点”列表中查看多伦多?注意db中的“places”可能只是“toronto”,也可能是逗号分隔的“ny,toronto,london,paris等”列表。
答案 0 :(得分:2)
如果可能的话,最好使用另一个表来保存用户选择的地方。使用列名称SelectedPlaces
:
mytable_id
- 要加入回到查询中的表格place
- EG:“Toronto”然后,您可以运行一个简单的查询来确定是否已选择多伦多:
SELECT *
FROM mytable m
INNER JOIN SelectedPlaces sp ON sp.mytable_id = m.id
WHERE sp.place = 'Toronto'
答案 1 :(得分:0)
如果我理解正确,那么您的数据库设计是错误的。尝试更多地阅读它。通常,在良好的设计中,您不应该将值列表作为数据库中的一个字段,您应该为它引入新表。
但是如果你想这样做,你可以使用strcmp函数。
答案 2 :(得分:0)
如果我理解正确,这应该有效:
WHERE DB.PLACES LIKE '%TORONTO%'
但正如其他用户所说,使用非规范化表格并不是一件好事。
答案 3 :(得分:0)
要直接回答您的问题,您的查询需要看起来像这样
SELECT *
FROM mytable
WHERE places LIKE( '%toronto%' )
但是,请注意,LIKE()很慢。
要间接回答您的问题,您的数据库架构都是错误的。这不是做M:N(多对多)关系的正确方法。
想象一下,你有这个
mytable place mytable_place
+------------+ +----------+----------+ +------------+----------+
| mytable_id | | place_id | name | | mytable_id | place_id |
+------------+ +----------+----------+ +------------+----------+
| 1 | | 1 | new york | | 1 | 1 |
| 2 | | 2 | toronto | | 1 | 2 |
| 3 | | 3 | london | | 1 | 3 |
+------------+ +----------+----------+ | 2 | 2 |
| 3 | 1 |
| 3 | 3 |
+------------+----------+
表mytable_places
是所谓的查找表(或者,外部参照/交叉引用表或相关表)。它唯一的工作是跟踪哪些mytable
记录有place
个记录,反之亦然。
从这个示例中我们可以看到第一个mytable
记录有所有3个个位置,第二个只有多伦多,第三个有纽约和伦敦。
这为您打开了各种各样的查询,这些查询对您当前的设计来说既困难,昂贵或不可能。
想知道有多少mytable
条记录有多伦多?没问题
SELECT COUNT(*)
FROM mytable_place x
LEFT JOIN place p
ON p.place_id = x.place_id
WHERE p.name = 'toronto';
每个地方mytable
条记录的数量如何排序?
SELECT p.name
, COUNT(*) as `count`
FROM mytable_place x
LEFT JOIN place p
ON p.place_id = x.place_id
GROUP BY p.place_id
ORDER BY `count` DESC, p.name ASC
这些 比任何使用LIKE的查询都要快,因为他们可以在place.name
等列上使用索引。