假设我有一个包含文章的表(article_id,article_name)和另一个包含订购文章的人名(person_id,person_name)的表。加上一个中间表,比如文章 - 人(article_id,person_id)。
有没有一种优雅的方式我可以做一个SELECT来获取所有文章和相关的购买者,这样文章将在标题中列出,人们列在他们购买的相应文章下?
此外,是否有一个SELECT可以获取所需的信息,但避免这样的结果(看起来像一个结构糟糕的数据库):
答案 0 :(得分:2)
这样的审美或显示要求应该在您的应用程序层处理,而不是在数据库层处理。
可以让DB返回无关联的行,但不建议这样做。您基本上要求的是返回没有关系信息的数据,这可能会导致问题。
返回所需数据更好,然后相应地过滤显示。 SQL没有针对这样的工作进行优化,在数据库级别格式化显示比在应用程序级别格式化要慢得多,而且要麻烦得多。
答案 1 :(得分:2)
这应该打印出带有值的行。
$res = mssql_query('SELECT *
FROM articles a
join articles-people ap on a.article_id=ap.articleid
join people p on ap.person_id=p.personid');
$results = array();
$finalResuls = array();
while($row = mssql_fetch_assoc($res))
{
$results[] = $row;
}
foreach($results as $result)
{
/* This makes an array with key:value pairs as string. */
foreach($result as $k => $v)
{
$finalResults[] = $k . ': ' . $v;
}
$string = '';
/* Will concatenate data for each result row into a single string */
foreach($result as $k => $v)
{
$string .= $k . ': ' . $v;
}
$finalResults[] = $string;
}
因此,您可以在同一篇文章中同时拥有这两个解决方案,这是您与JNK讨论的解决方案。
$res = mssql_query('SELECT * from article');
$results = array();
while($row = mssql_fetch_assoc($res))
{
$id = $row['article_id'];
$res2 = mssql_query("SELECT * from people p join articles-people ap on p.person_id=ap.person_id where ap.article_id='$id'");
while($row2 = mssql_fetch_assoc($res2))
{
foreach($row2 as $k => $v)
{
$results[$id][] = $k . ': ' . $v;
}
}
}