1

我什至不确定要搜索什么,如果这已经在某个地方覆盖,请原谅我。

我有一个从多个表中提取数据的 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

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

查询一:

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);
}

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

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

4

3 回答 3

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

编辑:我假设 people 表中的每条记录在 Assets 表中至少有一个匹配记录 - 如果没有,请在查询中使用外连接。

编辑:我不熟悉 SyBase,但快速搜索相关函数给了我一个坏消息:MYSQL group_concat 在 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
    }
}
于 2012-09-12T01:35:53.110 回答
0

在此处使用 Sybase LIST函数。

例如

SELECT ID,NAME,LIST(ASSETS)
FROM PEOPLE
GROUP BY ID,NAME
于 2012-09-12T03:19:08.310 回答
-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
于 2012-09-12T05:07:25.647 回答