示例数据库结构(download table)
id | pid | title
----------------------------------------------------
1 | 3,4,5 | Download 3, Download 4, Download 5
----------------------------------------------------
2 | 3 | Download 3
----------------------------------------------------
这是我的代码
<?php
$pid = explode(",", $order['pid']);
for($x = 0; $x < count($pid);){
if(count($pid) == 1 ) {
$thepid = 'pid="'.$pid[$x].'"';
} else {
$thepid = 'pid="'.$pid[$x].'" OR ';
}
$x++; }
$select = 'SELECT * FROM download WHERE '.$thepid.'';
$query = $db->rq($select);
while($download = $db->fetch($query)) {
?>
问题 -
$select
多pid="3" OR pid="4" OR pid="5"
,如何count($pid)
可以阅读{{1}}。我知道表结构不正常。但是如何才能使它发挥作用。
答案 0 :(得分:2)
这不是表示数据的好方法。
我假设您的列代表
id - &gt; USER_ID
pid - &gt;用户下载的所有项目列表(逗号分隔)
标题 - &gt;用户下载的所有项目名称列表(逗号分隔)
这种方法的一点是你会发现像这样的查询比用普通方法更难表达。例如:
表用户
USER_ID
表格文件
PID
标题
表格下载
USER_ID
PID
既作为对应表的外键
您的查询将成为
<?php
$pid = explode(",", $order['pid']);
for($x = 0; $x < count($pid);){
if($x == 0 ) {
$thepid = 'pid='.mysql_real_escape_string($pid[$x]);
} else {
$thepid = 'OR pid='.mysql_real_escape_string($pid[$x]);
}
$x++; }
$select = 'SELECT user_id FROM download WHERE '.$thepid.'';
$query = $db->rq($select);
while($download = $db->fetch($query)) {
?>
答案 1 :(得分:2)
也许我过度简化了这一点,但这不会更容易吗?
<?php
$select = 'SELECT * FROM download WHERE pid IN ('.$order['pid'].')';
$query = $db->rq($select);
while($download = $db->fetch($query)){}
?>
答案 2 :(得分:1)
使用REGEXP
SELECT * FROM download WHERE pid REGEXP '\\b(3|4|5|12)\\b'
如果不支持\\b
,您可以尝试:
SELECT * FROM download WHERE pid REGEXP '(^|,)(3|4|5|12)(,|$)'
答案 3 :(得分:0)
如果你想坚持使用这种结构(如果你想进行这样的查询,这不是最佳的),你可以使用LIKE:
SELECT * FROM download WHERE pid LIKE '%3%' OR pid LIKE '%4%' OR pid LIKE '%5%'
但如果你有数字&gt;你会遇到麻烦9。
我真的建议规范你的桌子!
对您的代码提出一些意见。
for
循环看起来很奇怪。为什么在最后增加$x
而不是在循环的“头部”中定义它?$thepid
循环中一次又一次地重新分配for
,因此它将具有上次迭代的值。count()
。这是一个改进版本,但请注意,只有在您的表格规范化后才能生效:
<?php
$pids = explode(",", $order['pid']);
$conds = array();
foreach($pids as $pid) {
$conds[] = 'pid="'.$pid.'"';
}
$conds = implode(' OR ', $conds);
$select = 'SELECT * FROM download WHERE '.$cond.'';
$query = $db->rq($select);
while($download = $db->fetch($query)) {