现在有三个表 最好不用子查询 (因为是改程序,程序上貌似有限制,用子查询会显示查询语句有危险)
三个表是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表进行关联
我刚想到了多对多但是不知道应该怎么弄。
三个表是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表进行关联
我刚想到了多对多但是不知道应该怎么弄。
想要的结果就是同时有这两个标签的列
其实我这弄的是论坛
forum是板块我现在想要的就是同时有你好和你很好这两个标签的板块
应该是这样的labelName是label表的一个列
于是关键问题不在这里。。
这逻辑上的问题应该怎么搞定呢
怎么都没看明白我的意思呢forum是板块,label是标签,related是中间表用来关联forum和label我现在要查询同时拥有‘新番’和‘星期一’这两个标签的板块,所以不能是or
如果是or的话就会把所有有‘新番’或者所有有‘星期一’的板块查询出来现在无所谓表结构什么的只要能得出结果就OK了。。
最好别用子查询。
因为我在discuz里面用子查询就报查询语句有危险什么的。
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
-- ----------------------------
-- 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的提醒。。
+-----+----------+
| 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>
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 = '星期一'
终于让我找到解决办法了。
话说从来没想过把一个表关联查询两次
应该说以前都不知道sql还能这么玩。话说我同时在百度知道和javaeye上提问了
百度知道上悬赏了一百五十分了
javaeye上也悬赏了仅有的30分。。我把地址贴出来不介意的话就过去回复一下我把分数都给了
javaeye
http://zhidao.baidu.com/question/363324049.html?oldq=1
百度知道