SQL连接在左表中显示重复项

时间:2013-03-14 12:00:00

标签: php sql join duplicates

我正在建造汽车租赁系统,我有2张桌子,一张用于汽车,一张用于租赁。我只希望表1中的所有内容都显示一次,表2中的所有内容都显示在表1中。

假设我的表格如下:

表1

  • ID
  • 模型

表2

  • id(与表1 id相同)
  • rentstart
  • rentstop
  • renttimestart
  • renttimestop`

我希望它在表格中显示如下:

  • Carid(t1)/ car(t1)/ model(t1)
  • rentstart(t2)-rentstop(t2)/ renttimestart(t2)-Renttimestop(t2)

示例:

  • 1 / BMW / 320
  • 14.3.2013-14.3.2013 / 13:30-14:30
  • 15.3.2013-15.3.2013 / 8:00-13:00

  • 2 / Audi / A4

  • 15.3.2013-15.3.2013 / 8:00-13:00

这就是我现在所拥有的:

 $sqlquery = 
  "SELECT * FROM table1 
   LEFT JOIN table2 ON table1.id=table2.id 
   GROUP BY table1.id";

(抱歉我的格式化)

3 个答案:

答案 0 :(得分:0)

您需要首先执行查询:

$sqlquery = "SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id";

这将提供每个id(多行)所需的所有记录。然后你需要使用一个语句(for,foreach等)在php中过滤你的记录。

流程如下:

  1. 执行查询
  2. 然后foreach记录检查ID,如果id与之前的id不同,或者0,则echo Carid(t1) / car(t1) / model(t1)
  3. 否则回显rentstart(t2)-rentstop(t2) / renttimestart(t2)-Renttimestop(t2)
  4. 希望你明白这一点。

答案 1 :(得分:0)

如果您希望所有汽车仅列出一次并通过汽车提供所有相应的租车,您应该使用某种循环。由于您没有提供您正在使用的数据库,我只能给您伪代码:

 $sqlquery = "SELECT * FROM table1";
 *execute query*
 while ($car = *fetch*) {
     *print car data*
     $sqlquery = "SELECT * FROM table2 where id = ?";
     *execute inner query with parameter binding: $car["id"]*
     while ($rent = *fetch*) {
         *print rent data*
     }
 }

一般提示:在第二个表格上使用主键,并将“id”重命名为“carid”。避免混淆。

答案 2 :(得分:0)

如果您希望在sql中完成所有操作,则可以创建存储过程:

declare @Table1 table
(
  Id int, 
  Car  varchar(100), 
  Model  varchar(100)
)
Insert into @Table1 values
Select ID,Car,model From Table1

Declare @Temp Table
(
    FinalValue varchar(300)
)

Declare @id int

While ((Select Count(*) From @Table1)>0)
Begin
 Set @id =(Select Top 1 id From @Table1)
 Insert Into @Temp 
 Select cast(id as varchar(5))+'/'+car+'/'+model From @Table1 Where Id=@id

 Insert @Temp Select rentstart+'-'+rentstop +'/'+ renttimestart+'-'+Renttimestop From Table2 Where Id=@id

 Delete From @Table1 Where Id=@id
End

Select * From @Temp

输出:

1/BMW /320
14.3.2013-14.3.2013/13:30-14:30
15.3.2013-15.3.2013/8:00-13:30
2/Audi/A4
15.3.2013-15.3.2013/8:00-13:30