我正在使用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 | |
+-------------+---------------------+------+-----+---------+----------------+
答案 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的关联性的细节。如有疑问,请使用括号使您的意图明确。