2013-02-21 5 views
2

Je récupère des données à partir de trois tables. Je veux afficher ces données dans la page jsp. Mon problème est que les données de jointure sont redondantesComment supprimer des données redondantes lors de l'affichage en jsp

Je ne souhaite pas afficher de données redondantes.

Mes tableaux sont

create table questions(id integer,title varchar(140),body varchar(2000), 
primary key(id)); 

create table question_tags(id integer,tag_name varchar(50),question_id integer, 
primary key(id),foreign key(question_id) references questions(id)); 


create table answers(id integer,answer varchar(2000),question_id integer, 
primary key(id),foreign key(question_id) references questions(id)); 

requête pour récupérer les données

SELECT questions.*,`question_tags`.*, `answers`.* 
FROM `questions` 
JOIN `answers` 
ON `questions`.`id` = `answers`.`question_id` 
JOIN `question_tags` 
ON `questions`.`id` = `question_tags`.`question_id` 
WHERE `questions`.`id` = '1' 

résultat après l'extraction de données

ID  TITLE BODY TAG_NAME QUESTION_ID ANSWER 
    1  a hello java     1   good 
    1  a hello java     1   exellent 
    1  a hello java     1   ok 
    1  a hello mysql    1   good 
    1  a hello mysql    1   exellent 
    1  a hello mysql    1   ok 
    1   a hello jquery    1   good 
    1  a hello jquery    1   exellent 
    1  a hello jquery    1   ok 

Ici, je fatching données à l'aide jeu de résultats et montrant dans jsp

Je veux afficher les données suivantes dans mon jsp

question.id|question.title|question.body|tag_names | answers 
     1    a   hello  java  good 
               mysql  excellent 
               jquery  ok        

Ce fut seulement quelques pas de lignes. Ici, le nombre total de lignes est égal à 1 * 3 * 3 = 9 Si les données sont augmentées dans les tables, les données en double sont augmentées afin de résoudre le problème. C'est sql fiddle pour le code ci-dessus

Répondre

1

Utilisez distinct clause avec votre instruction select pour obtenir aucun enregistrement en double

SELECT distinct questions.*,`question_tags`.*, `answers`.* 
FROM `questions` 
JOIN `answers` 
ON `questions`.`id` = `answers`.`question_id` 
JOIN `question_tags` 
ON `questions`.`id` = `question_tags`.`question_id` 
WHERE `questions`.`id` = '1' 

Mise à jour

ResultSet rs = st.execute(); //Assuming that you have the resultset 

Set<String> id = new LinkedHashSet<String>(); 
Set<String> body = new LinkedHashSet<String>(); 
Set<String> tag_name = new LinkedHashSet<String>(); 
Set<String> answer = new LinkedHashSet<String>(); 

while(rs.next()) 
{ 
    id.add(rs.getString("id")); 
    body.add(rs.getString("body")); 
    tag_name.add(rs.getString("tag_name")); 
    answer.add(rs.getString("answer")); 
} 

En raison des LinkedHashSet que des valeurs distinctes seront stockées . Maintenant, vous devez itérer pour remplir votre table

NOTE: Ceci est limité à une question particulière ID

+0

ne fonctionne pas montrer les 9 rangs –

+0

Comment pouvons- vous souhaitez montrer votre résultat en tant que ?? – asifsid88

+0

question.id, question.title, question.body, tag_names (java, mysql, jquery) réponses (bon, excellent, ok) s'il vous plaît voir http://sqlfiddle.com/#!2/e9606/21 –

0

Ce que j'attendais était ce

SELECT `questions`.`id` AS `question_id` , 
(
SELECT GROUP_CONCAT( `question_tags`.`tag_name` SEPARATOR ';') 
FROM `question_tags` 
WHERE `question_id` =1 
) AS `Tags` , 
(
SELECT GROUP_CONCAT( `answers`.`answer` SEPARATOR ';') 
FROM `answers` 
WHERE `question_id` =1 
) AS `Answers` 
FROM `questions` 
WHERE `questions`.`id` =1 
Questions connexes