mysql选择查询问题

时间:2010-04-08 15:40:13

标签: php mysql

我的表单有多个选择下拉列表。用户可以在选择中选择多个选项。选择的名称是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等”列表。

4 个答案:

答案 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等列上使用索引。