SQL SELECT DISTINCT但结合另一个表的结果

时间:2012-09-12 01:32:25

标签: php sql select odbc sybase

我甚至不确定要搜索什么,请原谅我,如果这已经被覆盖了。

我有一个SELECT语句从多个表中提取数据。正如预期的那样,如果我运行此查询,我会得到第二个表中每条记录的记录,如下所示。

|ID     |Name     |Assets
 ------------------------------------
|1      |Bob      |Car
|1      |Bob      |Bicycle
|1      |Bob      |House
|2      |Jane     |Car
|2      |Jane     |House
|3      |Peter    |Boat
|3      |Peter    |Car
|3      |Peter    |Motorcycle

我想要的是这样的:

|ID     |Name     |Assets
 ------------------------------------
|1      |Bob      |Car,Bicycle,House
|2      |Jane     |Car,House
|3      |Peter    |Boat,Car,Motorcycle

我已经能够通过简单地为第一个表中的每个记录第二次访问数据库来实现这一点,但这使得我的页面变得缓慢,因为它每次刷新大约40-60次数据库

查询1:

SELECT ID,Name FROM People

然后在while循环中查询2:

<?php
while($owner_row=odbc_fetch_array($query1) {
$assets = odbc_exec($conn,"SELECT Asset FROM Assets WHERE Owner='$owner_row[Name]'");
$asset_array = odbc_fetch_array($assets);
$asset_string = implode(",",$asset_array);
}

然后,我可以将每个所有者的资产结果合并到一个字符串中,并根据需要显示它们。

有没有办法在单个查询中实现这一点,以便我只访问数据库一次,并以某种方式将这些资产合并到查询本身的单个值中?

3 个答案:

答案 0 :(得分:3)

我不确定你正在使用什么数据库,但是如果你使用的是mySQL,那么有一个可爱的函数就是这个叫做group_concat的函数,它的工作原理如下:

select 
    a.ID, 
    a.Name, 
    group_concat(b.Asset) as assetGroup 
from 
    people a
        join Assets b
            on a.ID=b.Owner 
group by 
    a.ID, 
    a.Name

哪个输出正确:

|ID     |Name     |Assets
 ------------------------------------
|1      |Bob      |Car,Bicycle,House
|2      |Jane     |Car,House
|3      |Peter    |Boat,Car,Motorcycle

编辑:我假设表格中的每条记录在资产表格中至少有一条匹配记录 - 如果没有,请在查询中使用外部联接。

编辑:我不熟悉SyBase,但快速搜索相关函数给了我一个坏消息:MYSQL group_concat equivalent in Sybase ASE?在SyBase中没有这样的函数,你必须编写一个存储过程来获得结果,但它表明您仍然可以直接在数据库上执行此操作(尽管以更加困难的方式)。

如果您不想编写存储过程,您仍然可以在查询中连接表,然后只需将每个ID返回许多行到PHP中,然后按照以下方式循环遍历它们:

$currentID=0;
$userAssets=array();
while($row=$AnotherRowFromTheDatabase)
{
    if($row['ID']==$currentID)
    {
        $userAssets[]=$row['Asset'];
    }
    else
    {
        $currentID=$row['ID'];
        // More stuff to move the array previously
        // and start a new Assets Array
    }
}

答案 1 :(得分:0)

在此处使用Sybase LIST功能。

e.g。

SELECT ID,NAME,LIST(ASSETS)
FROM PEOPLE
GROUP BY ID,NAME

答案 2 :(得分:-1)

请使用以下SQL:

declare @tempUser  Table
(
ID int,
Name nvarchar(250),
AssetNAme nvarchar(250)
)
Insert into @tempUser values(1,'Bob','Car')
Insert into @tempUser values(1,'Bob','Bicycle')
Insert into @tempUser values(1,'Bob','House')
Insert into @tempUser values(2,'Jane','Car')
Insert into @tempUser values(2,'Jane','House')
Insert into @tempUser values(3,'Peter','Boat')
Insert into @tempUser values(3,'Peter','Car')
Insert into @tempUser values(3,'Peter','MotorCycle')


select  tt.ID,tt.Name,(select ITT.AssetNAme + ', ' as 'data()'  from @tempUser as ITT 
where ITT.ID =tt.ID for xml path('')) from @tempUser  as tt group by tt.ID,tt.Name