两个表的逻辑问题

时间:2010-06-15 18:41:49

标签: php mysql

嘿伙计们,我为灯具创建了一个列表。

$result = mysql_query("SELECT date FROM ".TBL_FIXTURES." WHERE compname = '$comp_name' GROUP BY date");
    $i = 1;
    $d = "Start";
    while ($row = mysql_fetch_assoc($result)) 
    {
        $odate = $row['date'];
        $date=date("F j Y", $row['date']);
        echo "<p>Fixture $i - $d to $date</p>";
    }

从查询中可以看出,日期显示在fixtures表中。 我的系统工作方式是当一个灯具“播放”时,它将从该表中删除。因此,当整个固定装置完成时,此表中的那一轮将不会有任何日期。他们将在另一张桌子上。

反正我是否可以同时运行其他日期查询,如果结果表中没有日期,则只显示来自fixtures表的日期?

"SELECT * FROM ".TBL_CONF_RESULTS." 
                               WHERE compid = '$_GET[id]' && type2 = '2' ORDER BY date" 

这将是第二个查询!

从这里编辑......

无论如何,我可以从两个表中选择日期,然后只有匹配时才使用一个。然后使用日期行(GROUPED BY)填充我的查询?这可能吗?

5 个答案:

答案 0 :(得分:2)

听起来你想要UNION两个结果集,类似于以下内容:

SELECT f.date FROM tbl_fixtures f
WHERE f.compname = '$comp_name'
UNION SELECT r.date FROM tbl_conf_results r
WHERE r.compid = '$_GET[id]' AND r.type2 = '2'
GROUP BY date

这应该选择f.date并从r.date中添加尚未包含在结果集中的行(至少这是T-SQL的行为)。显然它可能无法很好地扩展,但有很多博客(搜索:UNION T-SQL)。

答案 1 :(得分:1)

来自this page的说明:

//performs the query
$result = mysql_query(...);

$num_rows = mysql_num_rows($result);

//if query result is empty, returns NULL, otherwise,
//returns an array containing the selected fields and their values
if($num_rows == NULL)
{
    // Do the other query
}
else
{
    // Do your stuff as now
}

答案 2 :(得分:1)

  1. WHERE compid = '$_GET[id]'SQL Injection提供了机会。
  2. TBL_FIXTURESTBL_CONF_RESULTS是否应该阅读$TBL_FIXTURES$TBL_CONF_RESULTS

答案 3 :(得分:1)

ChrisF有解决方案!

您可能想到的另一件事是是否有必要执行删除并移动到另一个表。解决此类挑战的常用方法是为每条记录包含一个状态字段,然后不仅仅查询所有where =“x”的查询“all”。例如,1可能是“暂存”,2可能是“正在使用”,3可能是“已使用”或“已存档”在您的示例中,而不是删除字段并将记录“移动”到另一个表(这也是必须在foreach循环中发生,人们会假设你可以简单地将状态字段更新为下一个状态。

因此,您不需要额外的表,每个记录删除一个额外的数据库命中,并从理论上提高应用程序的性能。

答案 4 :(得分:1)

看起来像你想要的是UNION查询。

$q1 = "SELECT DISTINCT date FROM ".TBL_FIXTURES." WHERE compname = '$comp_name'";
$q2 = "SELECT DISTINCT date FROM ".TBL_CONF_RESULTS. 
      "WHERE compid = '$_GET[id]' && type2 = '2'";

$q = "($q1) UNION DISTINCT ($q2) ORDER BY date";