Se connecter

Informatique

Création de sites web

Sujet : Inner join retourne des résultats dupliqués
1
WoWKamsunette
Niveau 53
24 novembre 2018 à 14:14:32

Bonjour,

$query = $db->prepare('SELECT topic.*, topic_message.message, topic_message.message_date, user.username FROM topic INNER JOIN topic_message ON topic.topic_id=topic_message.topic_id INNER JOIN user ON topic_message.user_id=user.user_id WHERE topic.forum_id=:forum_id ORDER BY topic_message.message_date DESC');

Je me retrouve avec 4 fois mon topics comment on fixe les inners join qui déraillent ?

20_cent_2017
Niveau 10
24 novembre 2018 à 17:24:57

LEFT JOIN ?

WoWKamsunette
Niveau 53
24 novembre 2018 à 18:32:01

Ca fait rien.

Un topic contient plusieurs messages donc il sort autant qu'il y a de message.

Thymotep
Niveau 10
24 novembre 2018 à 18:35:09

Hello, j'ai pas réfléchi à ta requête mais un petit GROUP BY topic.topic_id ça ne suffit pas ?

WoWKamsunette
Niveau 53
24 novembre 2018 à 23:45:51

Je connais pas bien

```php
$query = $db->prepare('SELECT topic.*, topic_message.message, topic_message.message_date, user.username FROM topic INNER JOIN topic_message ON topic.topic_id=topic_message.topic_id INNER JOIN user ON topic_message.user_id=user.user_id WHERE topic.forum_id=:forum_id
AND topic_message_id IN (
SELECT MAX(topic_message_id)
from topic_message
GROUP BY topic_id
);
ORDER BY topic_message.message_date DESC');
```
J'ai pas les topics sans messages dedans.

WoWKamsunette
Niveau 53
25 novembre 2018 à 11:46:57

```sql
SELECT
topic.*,
topic_message.message,
topic_message.message_date,
user.username
FROM topic
LEFT JOIN topic_message
ON topic.topic_id=topic_message.topic_id
LEFT JOIN user
ON topic_message.user_id=user.user_id
WHERE
topic.forum_id=2
AND
(
topic_message_id IN (
SELECT MAX(topic_message_id)
from topic_message
GROUP BY topic_id
)
OR topic_message_id IS NULL
)
ORDER BY topic_message.message_date DESC
```

J'ai les topics sans messages mais pas classé du coup par date vu qu'il y a pas le topic message date comment faire pour utiliser topic date pour comparer du coup ?

Aylmao
Niveau 10
27 novembre 2018 à 21:32:22

Tu ferais mieux de nettoyer correctement ton code car ça ne me donne pas envie de comprendre ton problème et en évitant aussi de répondre à ton message du dessus, si on ne te répond pas, n'insiste pas ce n'est pas une messagerie instantanée mais un forum.

WoWKamsunette
Niveau 53
27 novembre 2018 à 22:37:02

nettoyer ?

Aylmao
Niveau 10
14 janvier 2019 à 00:48:00

Le 27 novembre 2018 à 22:37:02 WoWKamsunette a écrit :
nettoyer ?

Que le code soit plus clair, mieux visible et compréhensible, mieux représenté, en gros, bien formaté comme ceci:

$query = $db->prepare('
SELECT topic.*, topic_message.message, topic_message.message_date, user.username 
FROM topic
INNER JOIN topic_message ON topic.topic_id = topic_message.topic_id
INNER JOIN user ON topic_message.user_id = user.user_id
WHERE topic.forum_id = :forum_id
ORDER BY topic_message.message_date DESC');
deepblue
Niveau 13
14 janvier 2019 à 09:24:37

Le 24 novembre 2018 à 18:32:01 WoWKamsunette a écrit :

Un topic contient plusieurs messages donc il sort autant qu'il y a de message.

C'est normal et c'est comme ça que les jointures fonctionnent.

WoWKamsunette
Niveau 53
14 janvier 2019 à 11:43:49
// Get topics in this forum
$query = $db->prepare("SELECT topic.*, topic_message.message, topic_message.message_date, user.username FROM topic LEFT JOIN topic_message ON topic.topic_id=topic_message.topic_id LEFT JOIN user ON topic_message.user_id=user.user_id WHERE topic.forum_id=:forum_id
 AND (
topic_message_id IN (
SELECT MAX(topic_message_id)
from topic_message
GROUP BY topic_id
)
OR topic_message_id IS NULL
)
ORDER BY (CASE WHEN topic_message.message_date IS NULL THEN topic.topic_date ELSE topic_message.message_date END) DESC LIMIT $message_limit OFFSET $begin");
$query->bindParam(':forum_id', $id);
$query->execute();
$topics = $query->fetchAll();

Je me retrouve avec ça au final qui semble marcher.

1
Sujet : Inner join retourne des résultats dupliqués
   Retour haut de page
Consulter la version web de cette page