Php mysql选择查询问题
我有一个表单,它有一个多选下拉列表。用户可以在“选择”对话框中选择多个选项。选择的名称是Php mysql选择查询问题,php,mysql,Php,Mysql,我有一个表单,它有一个多选下拉列表。用户可以在“选择”对话框中选择多个选项。选择的名称是数组[];使用php我调用内爆(“,”,$array) 在mysql db中,它将字段存储为文本,格式为“places”=“new york,toronto,london”当我要显示这些字段时,我会将逗号分解 我正在尝试运行一个报告来显示位置。以下是我的选择: “从mytable中选择*,其中db.places..userSelectedPlaces” 如何在用户选择的“地点”列表中检查多伦多?注意:数据库中
数组[]
;使用php我调用内爆(“,”,$array)
在mysql db中,它将字段存储为文本,格式为“places”=“new york,toronto,london”
当我要显示这些字段时,我会将逗号分解
我正在尝试运行一个报告来显示位置。以下是我的选择:
“从mytable中选择*,其中db.places..userSelectedPlaces”
如何在用户选择的“地点”列表中检查多伦多?注意:数据库中的“地点”可能只是“多伦多”,也可能是逗号分隔的地点列表,如“纽约、多伦多、伦敦、巴黎等”。如果我理解正确,您的数据库设计就是错误的。试着多读一些。通常,在良好的设计中,不应该将值列表作为数据库中的一个字段,而应该为其引入新表
但如果您想这样做,可以使用函数。如果可能,最好使用另一个表来保存用户选择的位置。使用以下列将其称为
SelectedPlaces
:
-返回查询中的表mytable\u id
-例如:“多伦多”地点
SELECT *
FROM mytable m
INNER JOIN SelectedPlaces sp ON sp.mytable_id = m.id
WHERE sp.place = 'Toronto'
如果我理解正确,这应该是可行的:
WHERE DB.PLACES LIKE '%TORONTO%'
但正如其他用户所说,非规范化表不是一件好事。要直接回答您的问题,您的查询需要如下所示
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\u 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
这可能需要一些代码格式。。。我同意贾斯汀·埃西尔的观点。但是,如果必须的话,请查看LOCATE函数设计成这样的原因是,一个人去过几个地方,而我们不想将这些地方存储在其他表中。注意,我用“位置”来代替我的实际目标。我明白了,但是这个表是非规范化的,这表明你的设计有问题。根据数据库设计原则,您应该引入新的表来存储每个用户访问的位置。看到贾斯汀·埃西尔的回答,他描述了这应该是什么样子。