我最后的作品之一是基于Yii的硬件目录.每个项目都可以与很多组链接.

CREATE TABLE item_group (

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

itemId INT(10) UNSIGNED NOT NULL,

groupId INT(10) UNSIGNED NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

仅显示必须由用户选择的所有groupIds的itemIds.这是我的错误解决方案:

$groups = isset($_GET['groups']) ? array_merge(array_diff($_GET['groups'], array('0'=>'-')),array()) : array();

$sql = '';

$brackets = '';

$groupMaxKey = count($groups) - 1;

//some code here

for($i=0;$i<=$groupMaxKey;$i++){

$sql .= "SELECT itemId FROM item_group WHERE groupId='".$groups[$i]."' ";

if($i != $groupMaxKey){

$sql .= "AND itemId IN (";

$brackets .= ")";

} else {

$sql .= $brackets;

}

}

我发现最大嵌套级别为32.更多组给出错误.什么是最干净的解决方案?

这里要澄清一个查询示例:

SELECT itemId FROM item_group

WHERE groupId='31' AND itemId IN (

SELECT itemId FROM item_group

WHERE groupId='24' AND itemId IN (

SELECT itemId FROM item_group

WHERE groupId='35'

)

)

答案确实有效:

SELECT g1.itemId

FROM ((((((((((((((((((((((((((((((((((((((( item_group g1

INNER JOIN item_group g2 ON g1.itemId = g2.itemId)

INNER JOIN item_group g3 ON g1.itemId = g3.itemId)

INNER JOIN item_group g4 ON g1.itemId = g4.itemId)

INNER JOIN item_group g5 ON g1.itemId = g5.itemId)

INNER JOIN item_group g6 ON g1.itemId = g6.itemId)

INNER JOIN item_group g7 ON g1.itemId = g7.itemId)

INNER JOIN item_group g8 ON g1.itemId = g8.itemId)

INNER JOIN item_group g9 ON g1.itemId = g9.itemId)

INNER JOIN item_group g10 ON g1.itemId = g10.itemId)

INNER JOIN item_group g11 ON g1.itemId = g11.itemId)

INNER JOIN item_group g12 ON g1.itemId = g12.itemId)

INNER JOIN item_group g13 ON g1.itemId = g13.itemId)

INNER JOIN item_group g14 ON g1.itemId = g14.itemId)

INNER JOIN item_group g15 ON g1.itemId = g15.itemId)

INNER JOIN item_group g16 ON g1.itemId = g16.itemId)

INNER JOIN item_group g17 ON g1.itemId = g17.itemId)

INNER JOIN item_group g18 ON g1.itemId = g18.itemId)

INNER JOIN item_group g19 ON g1.itemId = g19.itemId)

INNER JOIN item_group g20 ON g1.itemId = g20.itemId)

INNER JOIN item_group g21 ON g1.itemId = g21.itemId)

INNER JOIN item_group g22 ON g1.itemId = g22.itemId)

INNER JOIN item_group g23 ON g1.itemId = g23.itemId)

INNER JOIN item_group g24 ON g1.itemId = g24.itemId)

INNER JOIN item_group g25 ON g1.itemId = g25.itemId)

INNER JOIN item_group g26 ON g1.itemId = g26.itemId)

INNER JOIN item_group g27 ON g1.itemId = g27.itemId)

INNER JOIN item_group g28 ON g1.itemId = g28.itemId)

INNER JOIN item_group g29 ON g1.itemId = g29.itemId)

INNER JOIN item_group g30 ON g1.itemId = g30.itemId)

INNER JOIN item_group g31 ON g1.itemId = g31.itemId)

INNER JOIN item_group g32 ON g1.itemId = g32.itemId)

INNER JOIN item_group g33 ON g1.itemId = g33.itemId)

INNER JOIN item_group g34 ON g1.itemId = g34.itemId)

INNER JOIN item_group g35 ON g1.itemId = g35.itemId)

INNER JOIN item_group g36 ON g1.itemId = g36.itemId)

INNER JOIN item_group g37 ON g1.itemId = g37.itemId)

INNER JOIN item_group g38 ON g1.itemId = g38.itemId)

INNER JOIN item_group g39 ON g1.itemId = g39.itemId)

INNER JOIN item_group g40 ON g1.itemId = g40.itemId)

WHERE g1.groupId='1' AND g2.groupId='2' AND g3.groupId='3' AND g4.groupId='4' AND g5.groupId='5' AND g6.groupId='6' AND g7.groupId='7' AND g8.groupId='8' AND g9.groupId='9' AND g10.groupId='10' AND g11.groupId='11' AND g12.groupId='12' AND g13.groupId='13' AND g14.groupId='14' AND g15.groupId='15' AND g16.groupId='16' AND g17.groupId='17' AND g18.groupId='18' AND g19.groupId='19' AND g20.groupId='20' AND g21.groupId='21' AND g22.groupId='22' AND g23.groupId='23' AND g24.groupId='24' AND g25.groupId='25' AND g26.groupId='26' AND g27.groupId='27' AND g28.groupId='28' AND g29.groupId='29' AND g30.groupId='30' AND g31.groupId='31' AND g32.groupId='32' AND g33.groupId='33' AND g34.groupId='34' AND g35.groupId='35' AND g36.groupId='36' AND g37.groupId='37' AND g38.groupId='38' AND g39.groupId='39' AND g40.groupId='40'

php 嵌套 mysql_php – 在MySQL中实现SQL INTERSECT时嵌套过高相关推荐

  1. mysql中利用sql语句修改字段名称,字段长度等操作(亲测)

    在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的m ...

  2. MySQL中的SQL Mode及其作用

    点击上方"蓝字" 关注我们,享更多干货! 与其它数据库不同,MySQL可以运行在不同的SQL Mode下.SQL Mode定义MySQL应该支持什么样的SQL语法,以及它应该执行什 ...

  3. 【MySQL 中 动态sql,游标_】

    MySQL 中   动态sql,游标_SQLServer MySQL的技术博客_51CTO博客

  4. oracle判断字段为空时选用别的字段_oracle中使用sql查询时字段为空则赋值默认

    转至:http://www.th7.cn/db/Oracle/201501/86125.shtml oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 oracle 函数介绍之nvl ...

  5. ACCESS中写SQL语句时尽量把表名和字段名用中括号括起来

    ACCESS中写SQL语句时尽量把表名和字段名用中括号括起来,一般都要写成: [TableName].FieldName,否则较长的中文名表名可能会被不识别.

  6. mysql中的sql

    变量 用户变量: 在用户变量前加@ 系统变量: 在系统变量前加@@ 运算符 算术运算符有: +(加), -(减), * (乘), / (除) 和% (求模) 五中运算 位运算符有: & (位于 ...

  7. php 加密保存mysql_PHP及MYSQL中字符串加密函数

    [IT168 服务器学院]我们在写PHP程序时经常要对用户的口令加密以确保安全,这时就要用到一些加密的函数.我总结了以下几种方法写出来供大家参考. 1.用MYSQL中的加密函数来加密:PASSWORD ...

  8. 如何在MySQL中执行SQL?

    前言 Mysql是免费的,其他⼏个⽬前暂时收费的,Mysql在互联⽹公司使⽤率也是排名第⼀,资料也⾮常完善,社区也⾮常活跃,所以我们主要学习Mysql.一键获取Mysql笔记文档 Mysql笔记文档5 ...

  9. mysql常见慢sql,MySQL中慢SQL的查询及原因分析

    准备数据 查看系统变量 SHOW VARIABLES LIKE 'slow_query%'; slow_query_log:慢sql日志开启状态 slow_query_log_file:慢sql日志存 ...

最新文章

  1. Java项目:贪吃蛇游戏(java+swing)
  2. html怎么写三段平行文本,试论实用文体翻译中平行文本的使用
  3. 谷歌正在开发的十大惊人项目
  4. java中怎么判断字符相等_Java中如何判断两个字符串相等
  5. R_地图上的迷你直方图
  6. sap生产工单报工_SAP作业分割与作业价格计算说明
  7. matlab拟合函数的三种方法
  8. 阿里矢量图库 当前页全选
  9. 原生小说APP源码,可二次开发,小说阅读,四端互通:android端,ios端,h5端,公众号端
  10. RFBnet论文及其代码详解
  11. 自发光物体能被烘焙之后是否会影响周围的物体
  12. 叶雕——叹为观止的艺术!
  13. php苹果支付订阅付费_比较订阅,按错误付费和咨询软件业务模型
  14. 第一届华数杯A题完整思路分享
  15. stemwin 实现显示屏幕滑动
  16. 神经网络理论及应用答案,神经网络理论名词解释
  17. 调取大华SDK获取IPC音视频流并得到H264帧
  18. GPIOB->CRH=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;(学习笔记)
  19. 01信息搜索:全面、快速查找全网你想要的任何信息、情报.
  20. 利用OCR解决增值税发票内容文本识别

热门文章

  1. 福建省国家税务局关于增值税一般纳税人认定生效时间的通知
  2. egret protobuf生成ts文件报错问题
  3. 配置Exchange邮箱服务器
  4. Fortran语言——矩阵乘法排列顺序问题
  5. hibernate单向一对多关联
  6. 偶数计算Python
  7. 三极管选型表二:常用NPN三极管型号及参数表
  8. kmp java_KMP算法的JAVA实现
  9. delphi中pos函数怎么用?
  10. 运放专题:运算放大电路中的相位补偿