如何以正确的方式在表中显示wordpress数据库值?

时间:2015-07-30 13:31:40

标签: php mysql wordpress duplicates html-table

我正在使用wordpress让人们注册任务。 普通帖子(即项目)有多个任务。 当用户想要注册task1时,他/她的usersname会在名为task1的元键字段中进入我的数据库中的元表。多个用户可以注册相同的任务。

我设法显示一个包含任务标题的表和所有注册的人。但我不想多次显示相同的标题和相同的任务名称。有人可以帮帮我吗?

当前输出是这样的

Title       Tasks   Volunteers
Project 1   Task 1  user3
Project 1   Task 1  user6
Project 1   Task 1  user5
Project 1   Task 2  user2
Project 1   Task 2  user9
Project 2   Task 1  user1
Project 2   Task 2  user8
Project 2   Task 2  user4

我希望它看起来像这样

Title       Tasks   Volunteers
Project 1   Task 1  user3
                    user6
                    user5
            Task 2  user2
                    user9

Project 2   Task 1  user1
            Task 2  user8
                    user4

这是我的代码。 我以为我在sql查询中使用了INNER JOIN,因为我需要从2个表中获取值(wp_1_posts和wp_1_postmeta)。

<?php
$query = "SELECT *
FROM wp_1_posts
INNER JOIN wp_1_postmeta
ON wp_1_posts.id=wp_1_postmeta.post_id
WHERE wp_1_postmeta.meta_key='task1'
OR wp_1_postmeta.meta_key='task2'
ORDER BY post_title";

$result = mysql_query($query) or die(mysql_error());
?>

<table border='1'>

    <tr>
        <th>Title</th>
        <th>Tasks</th>
        <th>Volunteers</th>
    </tr>

    <?php

        while($row = mysql_fetch_assoc($result))
    {
    $post_title = $row['post_title'];
    $meta_key = $row['meta_key'];
    $meta_value = $row['meta_value'];

    if ($meta_key == 'task1'){
        $task_name = "Task 1";
    }
    else if ($meta_key == 'task2'){
        $task_name = "Task 2";
    }

    echo "<tr>";
    echo "<td>". $post_title. "</td>";
    echo "<td>". $task_name. "</td>";
    echo "<td>". $meta_value. "</td>"; //names of volunteers
    echo "</tr>";
    }
?>
</table>

1 个答案:

答案 0 :(得分:0)

您无法获得与SQL相似的结果。那些&#34;洞&#34;没有像你那样的东西。

如评论所述,你的INNER vs OUTER JOIN在这种情况下并没有真正有所作为。我通常使用LEFT JOIN(一个外部联接)来连接帖子元数据的帖子。

但是,我认为你还好。它只是显示结果的方式。请注意,您需要titletask列,以确定每个volunteers所属的位置。

你说同样的话,但你以不同的方式对它进行可视化。您为最终用户省略了一些您所暗示的重复。

你可以简单地将一个阵列放在一边,跟踪你已经显示过哪些任务和标题,然后在你的循环上如果它已经显示,确保它被设置为空字符串。

例如:

$titles = array();
$tasks = array();
while($row = mysql_fetch_assoc($result)) {
    // set the $post_title to the actual title or an empty string based on if it was already seen or not  
    $post_title = !in_array($row['post_title'], $titles) ? $row['post_title']:'';

    // record that it has been seen
    $titles[] = $row['post_title'];

    // ...do the same for tasks and then the rest of your code as you had it

请记住,如果您的任务名称可以在每个标题部分下多次出现,则需要稍微调整一下该逻辑。在这种情况下,您可能希望保留带有title.task组合的键控数组。

无论如何,希望能让您了解如何以相对简单的方式跟踪已经显示的内容,以便获得所需的输出。

SQL无法始终返回完美的表格结果。

如果您最终完成许多任务,这也有点问题:

if ($meta_key == 'task1'){
    $task_name = "Task 1";
}
else if ($meta_key == 'task2'){
    $task_name = "Task 2";
}

您可以创建一个格式化程序帮助函数,该函数将使用PHP的ucwords()ucfirst()函数,并且可能使用字符串替换或甚至更重的正则表达式来在数字之间添加空格等。我打赌10美元,你可以找到一些代码片段,可以帮助你使标题漂亮。这里的关键字是&#34; humanize&#34; ...那里的许多框架和片段都会有这样的帮助实用程序类和函数,通常是通过这种措辞。

您也可以使用某种jQuery插件(或其他一些JavaScript工具)来运行表格数据,并可以按照您之后的方式对其进行格式化。它甚至可能提供一些更高级的排序选项。然后你就可以对表格结果进行JSON编码,并以你需要的格式得到你想要的结果。这可能是最接近开箱即用的SQL结果,而没有使用PHP进行任何格式化。