日期:2014-05-16  浏览次数:21931 次

有个多对多的问题希望能有大侠给解答一下
现在有三个表 最好不用子查询 (因为是改程序,程序上貌似有限制,用子查询会显示查询语句有危险。。。)
三个表是forum ,label,related
forum 里有主键ID,label里有主键ID和labelName两列,related里有主键ID和forumID还有labelID。

select forum.ID from forum LEFT JOIN related ON forum.ID = related.forumID LEFT JOIN label ON label.ID = related.labelID where (label = '你好' and label = '你很好') or label = '你不好'

于是现在查询结果是空。。。。。。。
我知道貌似是(label = '你好' and label = '你很好') 这个地方有点逻辑问题
于是乎有没有高手能提供个解决办法什么的。。。。。。
不一定非得用related表进行关联
我刚想到了多对多但是不知道应该怎么弄。。。。

------解决方案--------------------
SQL code
mysql> select * from forum;
+-----+----------+
| fid | name     |
+-----+----------+
|   1 | Discuz!  |
|   2 | 默认版块 |
|   3 | 影音     |
|   4 | 情感     |
|   5 | 生活     |
|   6 | 休闲     |
|   7 | 游戏     |
|   8 | 体育     |
|   9 | 电影     |
|  10 | 音乐     |
|  11 | 视频     |
|  12 | 电视     |
|  13 | 交友     |
|  14 | 单身     |
|  15 | 诉说     |
|  16 | 婚恋     |
|  17 | 美食     |
|  18 | 购物     |
|  19 | 美容     |
|  20 | 健康     |
|  21 | 汽车     |
|  22 | 时尚     |
|  23 | 星座     |
|  24 | 摄影     |
|  25 | 宠物     |
|  26 | 动漫     |
|  27 | 旅游     |
|  28 | 设计     |
|  29 | 足球     |
|  30 | 篮球     |
|  31 | 羽毛球   |
|  32 | 乒乓球   |
|  33 | 网游     |
|  35 | 单机     |
|  36 | 动漫区   |
|  37 | 漫画区   |
|  38 | 动漫一   |
|  39 | 动漫二   |
|  40 | 动漫三   |
+-----+----------+
39 rows in set (0.00 sec)

mysql>
mysql> select * from label;
+----+--------+
| ID | Name   |
+----+--------+
|  1 | 新番   |
|  2 | 星期一 |
+----+--------+
2 rows in set (0.00 sec)

mysql>
mysql> select * from related;
+----+---------+---------+
| ID | labelID | forumID |
+----+---------+---------+
|  1 |       1 |      38 |
|  2 |       2 |      38 |
|  3 |       1 |      39 |
+----+---------+---------+
3 rows in set (0.00 sec)

mysql> select f.fid, f.name
    -> from forum f inner JOIN related r1 ON r1.forumID = f.fid
    ->  inner join related r2 on r2.forumID = f.fid
    ->  inner JOIN label l1 ON r1.labelID = l1.ID
    ->  inner JOIN label l2 ON r2.labelID = l2.ID
    -> where l1.Name = '新番' and l2.Name = '星期一';
+-----+--------+
| fid | name   |
+-----+--------+
|  38 | 动漫一 |
+-----+--------+
1 row in set (0.08 sec)

mysql>