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 ?
LEFT JOIN ?
Ca fait rien.
Un topic contient plusieurs messages donc il sort autant qu'il y a de message.
Hello, j'ai pas réfléchi à ta requête mais un petit GROUP BY topic.topic_id ça ne suffit pas ?
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.
```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 ?
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.
nettoyer ?
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');
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.
// 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.