如何在一行中显示SQL查询结果?

7
我正在努力让这个工作,但却让我感到非常苦恼。我有三张表需要处理,它们分别是 "tblhosting"、"tblhostingconfigoptions" 和 "tblcustomfieldsvalues"。你可以在 SQLFiddle 中找到这些表的设置:http://sqlfiddle.com/#!9/6c153/1 我的目标是使查询结果在一行内显示,如下图所示: 以下是我的 SQL 查询语句:
SELECT DISTINCT 
t1.domainstatus,
t1.server,
t1.dedicatedip,
t1.packageid,
t1.regdate,
t1.nextduedate,
t2.value,
t2.fieldid,
t3.configid,
t3.qty
FROM tblhosting t1
INNER JOIN tblcustomfieldsvalues t2 
ON t2.relid = t1.id 
INNER JOIN tblhostingconfigoptions t3 
ON t3.relid = t1.id
WHERE t3.configid IN (126,127,128) AND t2.fieldid IN
(83,84,85,86,87,88,90,91,92,93,208) ORDER by t1.id -- I use to have GROUP by t1.id and get 1 line for the 126 but then 127 128 will not be produced.

我将仅隔离<td>标签并处理它所在的问题,这段PHP代码如下:
$sql = mysql_query($queryText);

while($row = mysql_fetch_array($sql)) {

  $qty = $row['qty'];
  $configid = $row['configid'];

  echo '<td id="sid">' . $row['value'] . '</td>';
  echo '<td id="smip">' . $dedicatedIP . '</td>';
  echo '<td id="10g">'; if ($configid == 126) { echo '4' } echo'</td>'; // the qty matching 126 should display there
  echo '<td id="40g">'; if ($configid == 127) { echo '0'} echo'</td>'; // the qty matching 127 should display there 
  echo '<td id="100g">'; if ($configid == 128) { echo '0' } echo'</td>'; // the qty matching 128 should display there

上述想法是使$configid匹配126或127或128,并相应地将行qty输出到字段中,其值为4 0 0,而不是3次输出“ded13526”,然后放置4、下一行放置0、再下一行放置0。
希望有足够的解释,我不想发布整个代码以引起混淆,很明显IN语句有80到93然后208,而这个确切的条目只有93。
我不知道哪里出了问题。

在输出(while循环)中,跟踪值,不要回显重复项。 - user557846
你的代码中用于输出表格行的语法完全错误。 - user1864610
@HP's411 请查看 http://sqlfiddle.com/#!9/6c153/2 ,使用 group by t2.fieldid 后,它确实进行了分组,但是我用这种方法丢失了127和128,所以基本上我回到了原点:/....更新:我知道了,但是一旦我按一个常见字段进行分组,它就会删除重复项,但同时隐藏了127和128,所以我无法再获取这些值。我曾经使用“Group by t1.id”来消除所有重复项,现在我无法仅获取t3.configid中的126,如果我尝试获取127和128,我将得到空值。 - Steini Petur
@SteiniPetur:在你的数据库中,有一个字段连接到所有表格,那个字段是什么?如果没有这样的字段,那么我认为你必须使用PHP代码来获得所需的输出。 - Hardik Bharadava
@SteiniPetur:我正在查找您的fiddle中的那些字段,有些字段没有提供所需的输出,而提供的输出也无法帮助实现所需的输出。 - Hardik Bharadava
显示剩余12条评论
2个回答

2

试试这个:

SELECT DISTINCT 
t1.domainstatus,
t1.server,
t1.dedicatedip,
t1.packageid,
t1.regdate,
t1.nextduedate,
t2.value,
t2.fieldid,
t3.configid,
t3.qty
FROM tblhosting t1
INNER JOIN tblcustomfieldsvalues t2 
ON t2.relid = t1.id 
INNER JOIN tblhostingconfigoptions t3 
ON t3.relid = t1.id
WHERE t3.configid IN (126,127,128) AND t2.fieldid IN
(83,84,85,86,87,88,90,91,92,93,208) GROUP BY t2.fieldid

我尝试了这个,使用t2.fieldid会随机输出大约10组数据,使用Group by t1.id可以获取所有内容,问题显然不在SQL中而在PHP中,我想要实现的是,因为我们知道t3.configid始终会有3个条目126 127 128,如果我们只对它们进行分组,我们会得到126和127 128消失了... 我似乎无法进入这个t3.configid 127 128,将它们添加到PHP端旁边的列中。 - Steini Petur
'<td id="10g">'; 如果$configid == 126 { echo $qty; } echo'</td><td id="40g">'; 如果$configid == 127 { echo $qty;} echo'</td> <td id="100g">'; 如果$configid == 128 { echo $qty; } echo'</td>`为什么我可以成功获取126,但无法获取127和128,只有在删除GROUP BY t1.id并停止分组并呈现3行后,我才能获取它们,但不能在单行中获取。 - Steini Petur

1
如果我正确理解了你的问题,这是如何解决的:
SELECT DISTINCT 
t1.domainstatus,
t1.server,
t1.dedicatedip,
t1.packageid,
t1.regdate,
t1.nextduedate,
t2.value,
t2.fieldid,
(SELECT qty FROM tblhostingconfigoptions WHERE relid = t1.id AND configid = 126) AS qty126,
(SELECT qty FROM tblhostingconfigoptions WHERE relid = t1.id AND configid = 127) AS qty127,
(SELECT qty FROM tblhostingconfigoptions WHERE relid = t1.id AND configid = 128) AS qty128
FROM tblhosting t1
JOIN tblcustomfieldsvalues t2 ON t2.relid = t1.id 
WHERE t2.fieldid IN (83,84,85,86,87,88,90,91,92,93,208)

while($row = mysql_fetch_array($sql)) {
  ...
  echo '<td id="sid">' . $row['value'] . '</td>';
  echo '<td id="smip">' . $row['dedicatedip'] . '</td>';
  echo '<td id="10g">' . $row['qty126'] . '</td>';
  echo '<td id="40g">' . $row['qty127'] . '</td>';
  echo '<td id="100g">' . $row['qty128'] . '</td>';
  ...

这很接近了,它能够获取每个数字,但会跳过一些,例如对于许多数字返回空值,但是在另一个数字中出现,详见链接。基本上它正在做我想要的事情,但并没有获取到所有的数字,我检查了"tblhostingconfigoptions",如果relid是3857(其中之一为空),而configid是126,则在126 127 128中确实有0 0 0,所以它应该出现,但它没有出现,然后我们有1240,它有0 0 0并且显示得非常好...这一定是SQL中限制了某些东西。我倾向于接受这个答案。 - Steini Petur
我也可以确认其中一个空列是fieldidrelid value 91 3558 ded22943使用fieldid 91,因此它不会在“IN()”中丢失,其他原因导致某些内容未显示。除此之外,您向我展示了一种我以前不知道的方法,我很感激 :) - Steini Petur
抱歉,我找到了问题所在。例如,3558 relid 在 tblhostingconfigoptions 中确实有相应的 126、127、128,但是例如 1006 relid 在 tblhostingconfigoptions 中没有 126、127、128。它只是不存在,因此无法使用您的方法进行链接 :).. 回答已经被接受,非常感谢 :) - Steini Petur
@SteiniPetur,欢迎您!还请考虑点赞这个答案 :) - dened
完成了,点赞并接受。 最后的难题是在这个 WHMCS 脚本中,我必须进入每个产品才能生成一个配置 ID 126 127 128 到 tblhostingconfigoptions 表中。基本上,我手动查找剩下的 80 多个产品,并查看它们的配置 ID 是否在数据库中生成,现在一切都运作得很好了.. 所有行都充满了数字 :).. 非常感谢! - Steini Petur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接