0

我正在尝试加入两个表并从“railstp”中选择。我已经简化了表格。

表“railstp”如下所示

count  startdate   startlocation    atoc

  1    2013-09-28     lester          a
  2    2013-09-28     nottm           a
  3    2013-09-20     lester          a   
  4    2013-09-28     birm            a 

表“位置”如下所示

count  startlocation  goodlocation

  1      lester         Leicester
  2      nottm          Nottingham

我正在尝试从表“位置”中获取“正确”(良好位置)描述以替换缩写描述(开始位置),并选择开始日期为 2013 年 9 月 28 日的所有位置。如果没有“正确”的描述,如果我只显示简短的描述就好了

所以我希望达到的结果是

2013-09-28    Leicester    a
2013-09-28    Nottingham   a
2013-09-28    birm         a

我的代码如下: -

require('connect_db.php');
mysqli_select_db($mysql_link,"Timetable");
function show_records($mysql_link)
{
$q="SELECT railstp.startdate,railstp.startlocation,railstp.atoc,location.startlocation,location.goodlocation
FROM railstp
LEFT JOIN location
ON railstp.startlocation=location.startlocation
WHERE railstp.startdate='2013-09-28'
ORDER BY startdate";

$r=mysqli_query($mysql_link,$q);

if ($r)
{
echo "<Table id='customers'>
<tr>
<th>From</th>
<th>Departing</th>
<th>ATOC</th>
</tr>";

while ($row=mysqli_fetch_array($r,MYSQLI_ASSOC))
{
echo "<tr>";
echo "<td>".$row['startdate']."</td>";
echo "<td>".$row['startlocation']."</td>";
echo "<td>".$row['atoc']."</td>";
echo "</tr>";
}
echo "</Table>";
}
else {echo '<p>'.mysqli_error($mysql_link).'</p>' ;}
}
show_records($mysql_link);
mysqli_close($mysql_link);

选择不显示“正确”(goodlocation)描述 - 即它应该显示诺丁汉而不是 nottm 和莱斯特而不是莱斯特

感谢您的帮助

4

2 回答 2

3

您可以为此使用 SQL 函数COALESCE()

此函数在其参数中使用第一个非空值。

SELECT railstp.startdate,
       COALESCE(location.goodlocation, railstp.startlocation) as startloc,
       railstp.atoc
FROM railstp
LEFT JOIN location
ON railstp.startlocation=location.startlocation
WHERE railstp.startdate='2013-09-28'
ORDER BY startdate

所以在这里,如果location.goodlocation是NULL,railstp.startlocation则使用。

请参阅SQL-fiddle

更新

如果要添加endlocation,可以再次加入位置表。我会指出,为了让事情变得更简单,我添加了表别名来区分不同的表。

SELECT r.startdate,
       COALESCE(l1.goodlocation, r.startlocation) as startloc,
       COALESCE(l2.goodlocation, r.endlocation) as endloc,
       r.atoc
FROM railstp r
LEFT JOIN location l1
ON r.startlocation = l1.startlocation
LEFT JOIN location l2
ON r.endlocation = l2.startlocation
WHERE r.startdate='2013-09-28'
ORDER BY r.startdate

当然,如果该location表同时用于开始位置和结束位置,则此设置。

于 2013-09-15T16:18:16.500 回答
1

您的查询中有两列同名。在 php 代码中没有办法告诉你想要哪个,所以选择第一个。用于as重命名其中之一:

SELECT rs.startdate, rs.startlocation as shortstartlocation, rs.atoc,
       coalesce(l.startlocation,  rs.startlocation) as startlocation,
       l.goodlocation
FROM railstp rs LEFT JOIN
     location l
      ON rs.startlocation = l.startlocation
WHERE rs.startdate = '2013-09-28'
ORDER BY startdate
于 2013-09-15T16:17:41.667 回答