如何循环INNER JOIN

时间:2014-08-14 10:05:33

标签: java mysql sql jsp servlets

此论坛上的一些用户帮助我创建了这个内部联接

SELECT a.*, p.* FROM artist a INNER JOIN pics p on p.id_artist = a.id 

查询这些表

      artist                          pics
-------------------       ---------------------------------------
| id | name | age |       | id_artist | picUrl | picDescription |
-------------------       ---------------------------------------
   |                          /\
   ----------------------------

现在我在循环resultSet时得到的是:

1    michael jackson    50    img/435432.jpg    concert
1    michael jackson    50    img/213234.jpg    family
1    michael jackson    50    img/123163.jpg    concert

喜欢"得到"是:

1    michael jackson    50    img/435432.jpg    concert
                              img/213234.jpg    family
                              img/123163.jpg    concert

但我无法理解如何循环它。

我必须将查询的结果放在许多名为Artist的对象中。这些是它的领域

int id;
String name;
int age;
Pic pics [];

这是对象Pic

int idArtist;
String Url;
String Description

所以我应该做的是:

while(resulset.next()){
   Artist artist = new Artist();
   artist.setId(resulset.getInt("a.id"));
   ........
   Pic pic = new Pic();
   pic.setIdArtist(resulset.getInt("a.id"));
   pic.setUrl(resulset.getInt("p.picUrl"));
   .....
   artist.setPic(pic );
}

但这不正确,因为这样我就可以获得db中每张图片的Artist对象。我想要的只是艺术家对象中的一个Artist对象和许多Pic对象。

4 个答案:

答案 0 :(得分:1)

希望您有一个想法/方向继续下面的代码。

String myCurrentID = "";
String strPreviousID = "";

while (moreRecordsAvailable)
{
    myCurrentID = resulset.getString("ID");
    if (!myCurrentID.equals(strPreviousID ))
    {
        // If the previous and current are different, then add both artist and picture objects
         strPreviousID =        myCurrentID ;
         Artist artist = new Artist();
         artist.setId(resulset.getString("a.id"));
         ........
         Pic pic = new Pic();
         pic.setIdArtist(resulset.getString("a.id"));
         pic.setUrl(resulset.getInt("p.picUrl"));
         .....
        artist.setPic(pic );
    }
    else
    {
        // If previous and current is same, then add only pictures object. Need not add artist object here.
        Pic pic = new Pic();
        pic.setIdArtist(resulset.getString("a.id"));
        pic.setUrl(resulset.getInt("p.picUrl"));
    }

}

答案 1 :(得分:0)

如果您想使用JSPhtml(表格)进行打印,可以循环显示resultsethtml属性,例如colspan和{{1 }}将帮助您在rowspan中生成所需的输出。

答案 2 :(得分:0)

如果你只想用sql做这件事,我想你只需要写一个pl / sql程序就可以做到这一点。首先,它会将您的查询结果保存在一个数组中,然后您可以使用它以您想要的格式自由打印它们。

DECLARE
cursor cursor1 
SELECT a.*, p.* FROM artist a INNER JOIN pics p on p.id_artist = a.id;
artist_rec  cursor1%rowtype;  --structure of one row
Type artist_array IS VARRAY(25) OF cursor1%rowtype -- array structure for holding returned select query
artist_arr artist_array; -- our array variable
i   NUMBER:=1;
BEGIN
    artist_arr  := artist_array; -- initialize array
    Open cursor1;
LOOP
    FETCH cursor1 into artist_rec  
    artist_arr .EXTEND(1); -- add another element to array with extend it
    artist_arr  (i) := artist_rec ; -- assign fetched row to array
    i := i + 1;  -- increment element count
END LOOP;
CLOSE cursor1;
FOR j IN artist_arr.FIRST.. artist_arr.LAST LOOP
    DBMS_OUTPUT_PUTLINE('') -- You can loop in result now, left is about output formats
                            -- and also you must hold a list of printed artist to avoid
                            -- not to write again


END LOOP;
END;

答案 3 :(得分:0)

维护List<Artist>并覆盖Artist#equalsArtist#hashCode,仅委托艺术家姓名。然后使用List#contains查看是否需要添加新的或使用现有的。最后,将pics设为List<Pic>,这样您就可以动态地将Pic添加到Artist。它是关于代码设计选择的,而不是关于SQL输出的。