LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1779|回复: 13

多选属性该怎么安排数据结构

[复制链接]
发表于 2007-3-30 02:07:19 | 显示全部楼层 |阅读模式
      多选属性该怎么安排数据结构

比如有一个产品有五十个属性,如果是单选的,用整数1---50 表示就行了

但如果是多选的话,该怎么安排MYSQL数据字段呢?

难道用多加50个字段来表示,然后每个属性再有0或1表示有和无

还是有其他方法?
 楼主| 发表于 2007-3-30 02:20:39 | 显示全部楼层

多选属性该怎么安排数据结构

多选属性该怎么安排数据结构

比如有一个产品有五十个属性,如果是单选的,用整数1---50 表示就行了

但如果是多选的话,该怎么安排MYSQL数据字段呢?

难道用多加50个字段来表示,然后每个属性再有0或1表示有和无

还是有其他方法?
回复 支持 反对

使用道具 举报

发表于 2007-3-30 09:02:31 | 显示全部楼层
主细表方式,即一对多的设计模式
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-30 09:25:06 | 显示全部楼层
Post by eire
主细表方式,即一对多的设计模式


多谢!

我想问一下是不是要用两个表呀
一个主表,一个细表
那怎么记录呢?我现在是通过多增加50个字段来做的

主要是用主细表的话,还有很多单选的,要搜索怎么办呀?
回复 支持 反对

使用道具 举报

发表于 2007-3-30 10:38:51 | 显示全部楼层
Post by eire
主细表方式,即一对多的设计模式

分两个表的话,显然是多对多关系嘛
每个产品可以有多个属性
每个属性可以被多个产品拥有
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-31 22:28:18 | 显示全部楼层
Post by csfrank
分两个表的话,显然是多对多关系嘛
每个产品可以有多个属性
每个属性可以被多个产品拥有


非常感谢!
郑重致谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-31 22:31:52 | 显示全部楼层
Post by csfrank
分两个表的话,显然是多对多关系嘛
每个产品可以有多个属性
每个属性可以被多个产品拥有



我现在是用增加了51个字段来做的了,每个字段用0和1表示该多选属性的有和无,不知道合不合适

下面是代码:


CODE:[Copy to clipboard]
[PHP]
<?php
include_once("db.php");
  ?>


<?php        

$t="s1=1 ";

if($_GET[hangye]!='')
{
$t=$t." and hangye='$_GET[hangye]'";

}
if($_GET[waixing]!='')
{
$t=$t." and waixing='$_GET[waixing]'";

}

if($_GET[diqu]!='')
{
$t=$t." and diqu='$_GET[diqu]'";

}

if($_GET[tuxing1]!='')
{
$t=$t." and tuxing1=1 ";

}

if($_GET[tuxing2]!='')
{
$t=$t." and tuxing2=1 ";

}

if($_GET[tuxing3]!='')
{
$t=$t." and tuxing3=1 ";

}

if($_GET[tuxing4]!='')
{
$t=$t." and tuxing4=1 ";

}

if($_GET[tuxing5]!='')
{
$t=$t." and tuxing5=1 ";

}

if($_GET[tuxing6]!='')
{
$t=$t." and tuxing6=1 ";

}

if($_GET[tuxing7]!='')
{
$t=$t." and tuxing7=1 ";

}

if($_GET[tuxing8]!='')
{
$t=$t." and tuxing8=1 ";

}

if($_GET[tuxing9]!='')
{
$t=$t." and tuxing9=1 ";

}

if($_GET[tuxing10]!='')
{
$t=$t." and tuxing10=1 ";

}

if($_GET[tuxing11]!='')
{
$t=$t." and tuxing11=1 ";

}

if($_GET[tuxing12]!='')
{
$t=$t." and tuxing12=1 ";

}

if($_GET[tuxing13]!='')
{
$t=$t." and tuxing13=1 ";

}

if($_GET[tuxing14]!='')
{
$t=$t." and tuxing14=1 ";

}

if($_GET[tuxing15]!='')
{
$t=$t." and tuxing15=1 ";

}


if($_GET[zimu0]!='')
{
$t=$t." and zimu0=1 ";

}



if($_GET[zimu1]!='')
{
$t=$t." and zimu1=1 ";

}

if($_GET[zimu2]!='')
{
$t=$t." and zimu2=1 ";

}

if($_GET[zimu3]!='')
{
$t=$t." and zimu3=1 ";

}

if($_GET[zimu4]!='')
{
$t=$t." and zimu4=1 ";

}

if($_GET[zimu5]!='')
{
$t=$t." and zimu5=1 ";

}

if($_GET[zimu6]!='')
{
$t=$t." and zimu6=1 ";

}

if($_GET[zimu7]!='')
{
$t=$t." and zimu7=1 ";

}

if($_GET[zimu8]!='')
{
$t=$t." and zimu8=1 ";

}

if($_GET[zimu9]!='')
{
$t=$t." and zimu9=1 ";

}






if($_GET[zimua]!='')
{
$t=$t." and zimua=1 ";

}

if($_GET[zimub]!='')
{
$t=$t." and zimub=1 ";

}

if($_GET[zimuc]!='')
{
$t=$t." and zimuc=1 ";

}

if($_GET[zimud]!='')
{
$t=$t." and zimud=1 ";

}

if($_GET[zimue]!='')
{
$t=$t." and zimue=1 ";

}

if($_GET[zimuf]!='')
{
$t=$t." and zimuf=1 ";

}

if($_GET[zimug]!='')
{
$t=$t." and zimug=1 ";

}

if($_GET[zimuh]!='')
{
$t=$t." and zimuh=1 ";

}

if($_GET[zimui]!='')
{
$t=$t." and zimui=1 ";

}

if($_GET[zimuj]!='')
{
$t=$t." and zimuj=1 ";

}

if($_GET[zimuk]!='')
{
$t=$t." and zimuk=1 ";

}

if($_GET[zimul]!='')
{
$t=$t." and zimul=1 ";

}

if($_GET[zimum]!='')
{
$t=$t." and zimum=1 ";

}

if($_GET[zimun]!='')
{
$t=$t." and zimun=1 ";

}

if($_GET[zimuo]!='')
{
$t=$t." and zimuo=1 ";

}

if($_GET[zimup]!='')
{
$t=$t." and zimup=1 ";

}

if($_GET[zimuq]!='')
{
$t=$t." and zimuq=1 ";

}

if($_GET[zimur]!='')
{
$t=$t." and zimur=1 ";

}

if($_GET[zimus]!='')
{
$t=$t." and zimus=1 ";

}

if($_GET[zimut]!='')
{
$t=$t." and zimut=1 ";

}

if($_GET[zimuu]!='')
{
$t=$t." and zimuu=1 ";

}

if($_GET[zimuv]!='')
{
$t=$t." and zimuv=1 ";

}

if($_GET[zimuw]!='')
{
$t=$t." and zimuw=1 ";

}

if($_GET[zimux]!='')
{
$t=$t." and zimux=1 ";

}

if($_GET[zimuy]!='')
{
$t=$t." and zimuy=1 ";

}

if($_GET[zimuz]!='')
{
$t=$t." and zimuz=1 ";

}






echo $t;




$result2 = mysql_db_query($DataBase, "select count(tid) from adc_photo  where  $t     ");
$r3 = mysql_fetch_array($result2);
$amount=$r3[0];
$page_size=30;
if($amount%$page_size==0 and $amount>0)
{
$pagecount=($amount/$page_size);
}else
{
$pagecount=intval($amount/$page_size)+1;
}
$page=min($pagecount,max(1,intval($_GET)));

$a=($page-1)*$page_size;   
$query = "select * from adc_photo where $t   order by tid desc limit $a,$page_size ";
$result = mysql_db_query($DataBase, $query);
while($rr2[]= mysql_fetch_array($result))
{}
array_pop($rr2);
?>
[/PHP]
上面有一点不足就是,GET提交的变量太长了,有几十个变量,字符串也有几百个,快超过GET最大值的极限了

但做搜索的时候,必须用GET而不能用POST,我说的对吧

另外,在做搜索的时候,一定要对一个表进行查询,而不能再涉及到另外一个表,这样是做不到的.
我说的是针对条件的部分(也就是说条件部分是不可能引入第二个表的),而不是针对整个SQL语句.

不知道我上面的搜索方法怎么样.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-31 22:35:03 | 显示全部楼层
Post by csfrank
分两个表的话,显然是多对多关系嘛
每个产品可以有多个属性
每个属性可以被多个产品拥有


如果要用分隔符分开来存放的话,搜索起来很麻烦,
比如有一个字段 hangye 的内容为:"1,3,11,17,18,22,23,27,28"

而有一个字符串变量 $aa  内容为:"3,11,23"

如果要找出$aa 的每个元素都存在于字段  hangye的话,这个SQL语句该怎么写

我说的 $aa 的每个元素也就是指 : 3和11和23

所以才要改数据结构

http://phpqcn.61236229242.open-source.cn/ddd/adc/search_high.php    就象我要做一个上面这样的高级搜索的话,就太麻烦了




所以 放弃了这种用符号分开存放的方法


如果要做一个上面的高级搜索的话,要怎么安排数据结构?
我现在是用多选的有多少项,我就增加多少个字段来做的,请问这样可以吗?

如果用多表关联来做的话,要查询的话,是很困难的,也就是说根本没法分页查询输出,因为有单选的属性在第一个表里面,而又有多选的产品属性在第二个表里面.所以用多对多的关系来处理的话,没法去搜索,请问该怎么安排呢?
非常感谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-31 22:46:06 | 显示全部楼层
Post by eire
主细表方式,即一对多的设计模式


多对多的关系,我已经通过实例研究过了,记录倒是可以记录,但要用PHP程序对符合单选属性和符

合多选属性的内容进行搜索的时候,是没法实现的,尤其是分页输出,更没法实现,

希望能帮我再找个方法

实例演示地址:
http://phpqcn.61236229242.open-source.cn/ddd/adc/search_high.php

请告诉一下,做上面的搜索该怎么做,如果用多表关联来做的话,谢谢!
回复 支持 反对

使用道具 举报

发表于 2007-4-1 08:24:45 | 显示全部楼层
Post by yanglei1979

上面有一点不足就是,GET提交的变量太长了,有几十个变量,字符串也有几百个,快超过GET最大值的极限了

但做搜索的时候,必须用GET而不能用POST,我说的对吧

另外,在做搜索的时候,一定要对一个表进行查询,而不能再涉及到另外一个表,这样是做不到的.
我说的是针对条件的部分(也就是说条件部分是不可能引入第二个表的),而不是针对整个SQL语句.

不知道我上面的搜索方法怎么样.
难为你了,搞这么复杂,不过你真有耐心啊
就算使用GET也不需要这么复杂,有两种方法:
1,不超过64位的话,结合javascript把用户的选择转换成一个64-bit整数提交。
2,超过64位的话,就转换成一串"0,1"字符串,然后由php在服务器端解析。
做搜索的时候谁规定只能查询一个表的啊?不会用join来链接多个表么?
就算是条件部分也没有这个限制。好好看看sql语法了么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表