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
    -返回查询中的表
  • 地点
    -例如:“多伦多”
然后,您可以运行一个简单的查询,以确定是否已选择Toronto:

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函数设计成这样的原因是,一个人去过几个地方,而我们不想将这些地方存储在其他表中。注意,我用“位置”来代替我的实际目标。我明白了,但是这个表是非规范化的,这表明你的设计有问题。根据数据库设计原则,您应该引入新的表来存储每个用户访问的位置。看到贾斯汀·埃西尔的回答,他描述了这应该是什么样子。