使用表达式从mysql表中选择

时间:2012-08-05 20:02:56

标签: mysql

我正在使用Mysql而我坚持我希望是一个简单的问题。 如果一个条件为真或另一个条件为真,我需要从表中选择数据。

我试过的一个选择返回数据,但是数据要多得多。实际上,该表只包含66条记录,但我的查询返回177条记录。我误解了一些事情。

我需要选择数据,如果[' city'等于一个值和'类型'是金色的]或'类型'属于名为' charms'

的类别

我已尝试过此查询

SELECT b.* 
FROM bubbles b, bubble_types bt 
WHERE 
  b.city = 10 
  AND b.type = 'golden' 
  OR bt.category = 'charm' 
  AND bt.type = b.type;

和这个(它根本不起作用,但可能更接近标记?)

SELECT b.* 
IF(b.city = 10, b.type = 'golden'), 
IF(bt.category = 'charm', bt.type = b.type) 
FROM bubbles b, bubble_types bt;

希望我想要的是有意义的吗?

我应该从10个城市中66个那些“金色”的气泡中获得大约10行,或者那些类型字段将它们归入类别'魅力'。

感谢;

编辑 bubble_types的示例表数据:

+----+----------+------------+ 
| id | category | type       | 
+----+----------+------------+ 
| 1  | bubble   | golden     | 
| 2  | charm    | teleport   | 
| 3  | charm    | blow       | 
| 4  | badge    | reuser     | 
| 5  | badge    | winner     | 
| 6  | badge    | loothunter | 
| 7  | charm    | freeze     | 
| 8  | badge    | reuser     | 
| 9  | badge    | winner     | 
| 10 | badge    | loothunter | 
+----+----------+------------+ 


mysql> describe bubbles;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| city        | bigint(20)          | YES  |     | NULL    |                |
| type        | varchar(32)         | YES  |     | NULL    |                |
| taken_by    | bigint(20)          | YES  |     | NULL    |                |
| taken_time  | bigint(20)          | YES  |     | NULL    |                |
| label       | varchar(256)        | YES  |     | NULL    |                |
| description | varchar(16384)      | YES  |     | NULL    |                |
| created     | datetime            | YES  |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

1 个答案:

答案 0 :(得分:2)

你真是太近了!用你的第二个括号(并在你的JOIN中添加一个适当的ON子句)取你第一次去的“WHERE” - :

SELECT b.* 
FROM bubbles b
   JOIN bubble_types bt 
   ON b.type = bt.type
WHERE 
  (b.city = 10 AND b.type = 'golden')
  OR 
  (bt.category = 'charm' AND bt.type = b.type);

魔鬼在where子句中关于AND和OR的关联性的细节。如有疑问,请使用括号使您的意图明确。