php - 无法弄清楚sql语句

标签 php mysql xml

有人可以帮助我吗?我正在尝试创建一个 xml 列表,其中包含按日期排序的所有事件。我使用 php 脚本来完成此操作。现在我有这个:

$sql = "SELECT DATE_FORMAT(K.kalender_datum,'%W %d %M %Y') as afhaaldag, A.afval_naam
        FROM tblkalender K
        INNER JOIN tblafval A
        ON A.pk_afval_Id = K.fk_afval_Id
        WHERE kalender_datum > CURDATE()
        ORDER BY K.kalender_datum";
$query = mysql_query($sql);

$last_date = "";
$tag_open = false;

$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml .= "<kalender>\n";

for($i = 0; $i<mysql_num_rows($query); $i++)
{   
    $itemrow = mysql_fetch_assoc($query);

    if($last_date != $itemrow['kalender_datum'])
    {
        //als de laatste datum die gebruikt is niet gelijk is aan de datum die hij binnen krijgt, moet hij een nieuwe afhaaldag beginnen
        if($tag_open)
        {
            $xml .= "\t</afhaaldag>\n";
            $tag_open = false;
        }
        $xml .= "\t<afhaaldag>\n";
        $xml .= "\t<datum>" . $itemrow['kalender_datum'] . "</datum>\n";
        $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n";    
        $last_date = $itemrow['kalender_datum'];
    }   

    else
    {
        $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n";
        $last_date = $itemrow['kalender_datum'];
        $tag_open = true;
    }   
}
$xml .= "</kalender>";
echo $xml;

这给了我这个 xml 输出:

<kalender>
   <afval>Grofvuil</afval>
   <afval>Restafval</afval>
   <afval>GFT</afval>
   <afval>PMD</afval>
   <afval>Snoeiresten</afval>
   <afval>GFT</afval>
   <afval>Restafval</afval>
   <afval>GFT</afval>
   <afval>PMD</afval>
   <afval>GFT</afval>
   <afval>Snoeiresten</afval>
   <afval>Papier en karton</afval>
   <afval>Grofvuil</afval>
   <afval>Restafval</afval>
   <afval>GFT</afval>
   <afval>PMD</afval>
</kalender>

但是我需要的是这个:

<kalender>
   <afhaaldag>
      <datum>2012-01-02</datum>
      <afval>GFT</afval>
      <afval>Restafval</afval>
      <afval>PMD</afval>
   </afhaaldag>
   <afhaaldag>
      <datum>2012-01-17</datum>
      <afval>Papier en karton</afval>
   </afhaaldag>
   <afhaaldag>
      <datum>2012-01-23</datum>
      <afval>GFT</afval>
   </afhaaldag>
</kalender>

有人知道我该怎么做吗?我知道我需要某种循环(我猜是 for 循环)。有人可以帮我解决这个问题吗?

最佳答案

我这里使用的是python,但是你可以按照代码进行操作,没有问题:

kalender = [
('2012-01-02', 'GFT'),
('2012-01-02', 'Restafval'),
('2012-01-02', 'PMD'),
('2012-01-17', 'Papier en karton'),
('2012-01-23', 'GFT')
] 

last_date = ""
tag_open = False

xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
xml += "<kalender>\n"


for i in kalender:
    # i[0] == datum
    # i[1] == afval

    # i == $itemrow in your code

    datum = i[0]
    afval = i[1]

    if last_date != datum:
        if tag_open:
            xml += "\t</afhaaldag>\n"
            tag_open = False

        xml += "\t<afhaaldag>\n"
        xml += "\t<datum>" + datum + "</datum>\n"
        xml += "\t<afval>" + afval +  "</afval>\n"
        last_date = datum
            tag_open = True
    else:
        xml += "\t<afval>" + afval + "</afval>\n"
        last_date = datum
        tag_open = True
xml += "\t</afhaaldag>\n"
xml += "</kalender>"
print xml

这是输出:

<?xml version="1.0" encoding="UTF-8"?>
<kalender>
    <afhaaldag>
    <datum>2012-01-02</datum>
    <afval>GFT</afval>
    <afval>Restafval</afval>
    <afval>PMD</afval>
    </afhaaldag>
    <afhaaldag>
    <datum>2012-01-17</datum>
    <afval>Papier en karton</afval>
    </afhaaldag>
    <afhaaldag>
    <datum>2012-01-23</datum>
    <afval>GFT</afval>
    </afhaaldag>
</kalender>

[完成]

输出正是您正在寻找的,是吗?尝试再次检查,因为在您的新输出中,数据标记不存在,所以这很奇怪。

注意我添加了两行:

tag_open = True  ##(in the True part of the If Statement)
xml += "\t</afhaaldag>\n" ###Before ending the kalender tag.

and删除else子句中的if语句。

代码:http://dl.dropbox.com/u/3389104/kal.py

--------编辑结束

我的评论(在代码中):

$last_date = "";
$tag_open = false;

for($i = 0; $i<mysql_num_rows($query); $i++)
{   
    $itemrow = mysql_fetch_assoc($query);   

    if ($last_date != $itemrow['kalender_datum'])  
    {
       //New Entry
       if (tag_open)
       {
           $xml .= "\t</afhaaldag>\n";
           tag_open = false;
       }
       $xml .= "\t<afhaaldag>\n";
       $xml .= "\t<datum>" . $itemrow['kalender_datum'] . "</datum>\n";
       $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n";
       $xml .= "\t</afhaaldag>\n";

       $last_date = $itemrow['kalender_datum']
    }
    else
    {
       if not (tag_open)
       {
           $xml .= "\t<afhaaldag>\n";
           tag_open = true;
       }
       $xml .= "\t<afval>" . $itemrow['afval_naam'] . "</afval>\n";
    }
}

请原谅一些拼写错误,我现在没有安装 php 的电脑。这段代码是我的总体想法,我不知道它是否有效。

关于php - 无法弄清楚sql语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979511/

相关文章:

php - 如何检查哪个路由器条件在 Codeigniter 中工作

php - Zend 路由反向匹配返回当前 URL

php - ajax json解码mysql获取数组

php - 类 : ADORecordSet_mysql Easy way to get an Array indexed by id of row

c# - 无法打开/读取包含重音字符的 XML 文件

php - 拉维尔 : How to exclude duplicate records when inserting a group of data into mysql?

php - 删除所有不需要的字符

mysql - 在 SQL 中查询包含日期的表

python - 解析600M超大XML文件

xml - xsl :template match attribute 中的正则表达式