现在有三个表 最好不用子查询 (因为是改程序,程序上貌似有限制,用子查询会显示查询语句有危险)
三个表是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表进行关联
我刚想到了多对多但是不知道应该怎么弄。

解决方案 »

  1.   

    label = '你好' or label = '你很好'
      

  2.   

    不是或者的关系
    想要的结果就是同时有这两个标签的列
    其实我这弄的是论坛
    forum是板块我现在想要的就是同时有你好和你很好这两个标签的板块
      

  3.   

    (labelName= '你好' and labelName= '你很好')我这里写错了
    应该是这样的labelName是label表的一个列
    于是关键问题不在这里。。
    这逻辑上的问题应该怎么搞定呢
      

  4.   

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

  5.   

    (label = '你好' or label = '你很好') or label = '你不好'
      

  6.   

    额。
    怎么都没看明白我的意思呢forum是板块,label是标签,related是中间表用来关联forum和label我现在要查询同时拥有‘新番’和‘星期一’这两个标签的板块,所以不能是or
    如果是or的话就会把所有有‘新番’或者所有有‘星期一’的板块查询出来现在无所谓表结构什么的只要能得出结果就OK了。。
      

  7.   

    忘了说了。
    最好别用子查询。
    因为我在discuz里面用子查询就报查询语句有危险什么的。
      

  8.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  9.   


    -- ----------------------------
    -- Table structure for `forum`
    -- ----------------------------
    DROP TABLE IF EXISTS `forum`;
    CREATE TABLE `forum` (
      `fid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
      `name` char(50) NOT NULL DEFAULT '',
      PRIMARY KEY (`fid`)
    ) ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records of forum
    -- ----------------------------
    INSERT INTO `forum` VALUES ('1', 'Discuz!');
    INSERT INTO `forum` VALUES ('2', '默认版块');
    INSERT INTO `forum` VALUES ('3', '影音');
    INSERT INTO `forum` VALUES ('4', '情感');
    INSERT INTO `forum` VALUES ('5', '生活');
    INSERT INTO `forum` VALUES ('6', '休闲');
    INSERT INTO `forum` VALUES ('7', '游戏');
    INSERT INTO `forum` VALUES ('8', '体育');
    INSERT INTO `forum` VALUES ('9', '电影');
    INSERT INTO `forum` VALUES ('10', '音乐');
    INSERT INTO `forum` VALUES ('11', '视频');
    INSERT INTO `forum` VALUES ('12', '电视');
    INSERT INTO `forum` VALUES ('13', '交友');
    INSERT INTO `forum` VALUES ('14', '单身');
    INSERT INTO `forum` VALUES ('15', '诉说');
    INSERT INTO `forum` VALUES ('16', '婚恋');
    INSERT INTO `forum` VALUES ('17', '美食');
    INSERT INTO `forum` VALUES ('18', '购物');
    INSERT INTO `forum` VALUES ('19', '美容');
    INSERT INTO `forum` VALUES ('20', '健康');
    INSERT INTO `forum` VALUES ('21', '汽车');
    INSERT INTO `forum` VALUES ('22', '时尚');
    INSERT INTO `forum` VALUES ('23', '星座');
    INSERT INTO `forum` VALUES ('24', '摄影');
    INSERT INTO `forum` VALUES ('25', '宠物');
    INSERT INTO `forum` VALUES ('26', '动漫');
    INSERT INTO `forum` VALUES ('27', '旅游');
    INSERT INTO `forum` VALUES ('28', '设计');
    INSERT INTO `forum` VALUES ('29', '足球');
    INSERT INTO `forum` VALUES ('30', '篮球');
    INSERT INTO `forum` VALUES ('31', '羽毛球');
    INSERT INTO `forum` VALUES ('32', '乒乓球');
    INSERT INTO `forum` VALUES ('33', '网游');
    INSERT INTO `forum` VALUES ('35', '单机');
    INSERT INTO `forum` VALUES ('36', '动漫区');
    INSERT INTO `forum` VALUES ('37', '漫画区');
    INSERT INTO `forum` VALUES ('38', '动漫一');
    INSERT INTO `forum` VALUES ('39', '动漫二');
    INSERT INTO `forum` VALUES ('40', '动漫三');-- ----------------------------
    -- Table structure for `label`
    -- ----------------------------
    DROP TABLE IF EXISTS `label`;
    CREATE TABLE `label` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `Name` varchar(255) NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records of label
    -- ----------------------------
    INSERT INTO `label` VALUES ('1', '新番');
    INSERT INTO `label` VALUES ('2', '星期一');-- ----------------------------
    -- Table structure for `related`
    -- ----------------------------
    DROP TABLE IF EXISTS `related`;
    CREATE TABLE `related` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `labelID` int(11) NOT NULL,
      `forumID` int(11) NOT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records of related
    -- ----------------------------
    INSERT INTO `related` VALUES ('1', '1', '38');
    INSERT INTO `related` VALUES ('2', '2', '38');
    INSERT INTO `related` VALUES ('3', '1', '39');select f.fid, f.name form forum f LEFT JOIN related r ON r.forumID = f.fid LEFT JOIN label l ON r.labelID = l.ID where l.Name = '新番' and l.Name = '星期一'
    我想要的结果是    38,动漫一where里面有冲突我知道
    我就是来问应该如何解决的不好意思。
    我是第一次在这里提问所以不知道该写成什么样的。
    谢谢ACMAIN_CHM的提醒。。
      

  10.   

    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>
      

  11.   

    SELECT *,f.fid, f.name FROM forum f LEFT JOIN related r ON r.forumID = f.fid
    LEFT JOIN related r1 ON r1.forumID = f.fid
     LEFT JOIN label l ON r.labelID = l.ID 
     LEFT JOIN label K ON r1.labelID = K.ID 
     WHERE l.Name = '新番' AND K.Name = '星期一'
      

  12.   

    十分感谢ACMAIN_CHM!!
    终于让我找到解决办法了。
    话说从来没想过把一个表关联查询两次
    应该说以前都不知道sql还能这么玩。话说我同时在百度知道和javaeye上提问了
    百度知道上悬赏了一百五十分了
    javaeye上也悬赏了仅有的30分。。我把地址贴出来不介意的话就过去回复一下我把分数都给了
      

  13.   

    http://www.iteye.com/problems/77888
    javaeye
    http://zhidao.baidu.com/question/363324049.html?oldq=1
    百度知道