Bonsoir,
Je me tourne vers vous car pour un projet perso j'aimerais lister 2 types de contenus dans une seule et unique catégorie.
Par exemple j'ai une catégorie Test et dans cette catégorie j'aimerais afficher des articles et des vidéos, mélangés et triés par date. Jusque là rien de bien méchant. Par contre j'aimerais associer aux articles leurs auteurs et idem pour les vidéos.
Du coup je ne sais pas trop comment construire ma requête :/
Si quelqu'un a une explication ou une piste je suis preneur :)
Si j'ai bien compris, tu as une table avec tes articles et tes videos, et une table avec les auteurs.
Dans ce cas avec des jointures c'est très simple :) Mon sql date un peu mais je pense que la syntaxe c'est :
SELECT * FROM Test t
LEFT JOIN User u ON t.author_id = u.id
Voilà en gros comment récuperer le tout :) Il te suffit de remplacer le * par ce que tu veux récuperer et le tour est jouer.
Par exemple :
SELECT t.title, t.date, t.link, t.description, u.username FROM test t
LEFT JOIN User u ON t.author_id = u.id
te retournera le titre, la date, le lien, la description et le nom de l'auteur pour chaque entrée de ta table test.
Pour ce qui est du LEFT JOIN, tu peux utiliser n'importe quelle jointure ça ne changera rien, moi j'ai toujours utilisée celle là :)
Oui sauf que là tu ne récupères que la table test et tu associes les données utilisateur qu'à la table test ;)
Ca je sais faire ^^
Ce que je veux faire c'est récupérer les deux tables et à chacune des tables associer les données utilisateurs :)
Si tes tables articles et vidéos ne contiennent pas les mêmes champs tu vas être obligé de faire deux requêtes séparées sinon tu peux utiliser UNION
Donne nous le descriptif des tables car la ce n'est pas très claire.
Mais comme le dit Jacob si tu à les même info (sans forcemement avoir les même nom) tu peut utilisé UNION
La table news contient
n_id
n_title
n_content
n_created
n_updated
n_author_id
n_cat_id
La table videos
v_id
v_title
v_created
v_updated
v_author_id
v_link
v_cat_id
Et la table membres
u_id
u_nickname
u_email
etc...
Je ne suis pas sûr qu'une union suffise dans le sens où pour les vidéos et pour les news je dois associr la table membres :/
Ou alors il faudrait que je renomme les champs pour qu'ils correspondent ?
Peut être quelque chose dans ce genre :
SELECT N.n_id AS id, N.n_title AS title, N.n_content AS content, N.n_created AS created,
N.n_updated AS updated, '' AS link
FROM news N
LEFT JOIN membres U ON N.n_author_id = U.u_id
WHERE N.n_cat_id = 1 -- l'id de ta categorie
UNION
SELECT V.v_id AS id, V.v_title AS title, '' AS content, V.v_created AS created, V.v_updated AS updated,
V.v_link AS link
FROM videos V
LEFT JOIN membres U ON V.v_author_id = U.u_id
WHERE V.v_cat_id = 1 -- l'id de ta categorie
ORDER BY updated
Sinon tu peut aussi faire :
SELECT tmp.id, tmp.title, tmp.content, tmp.creaded, tmp.updated, tmp.link, U.u_nickname
FROM (
SELECT n_id AS id, n_title AS title, n_content AS content, n_created AS created,
n_updated AS updated, '' AS link, n_cat_id AS cat_id, n_author_id AS author_id
FROM news
UNION
SELECT v_id AS id, v_title AS title, '' AS content, v_created AS created, v_updated AS updated,
v_link AS link, v_cat_id AS cat_id, v_author_id AS author_id
FROM videos
) AS tmp
LEFT JOIN membres U ON tmp.author_id = U.u_id
INNER JOIN categories C ON tmp.cat_id = C.c_id
ORDER BY tmp.updated
Je te remercie je vais tenter ça :)
Je connais l'id de la catégorie mais du coup je verrais pour utiliser ta requête sur mon index :)
je pense que la deuxième solution est la plus optimisé niveau perf
après a toi de bien gérer les jointures j'ai mis inner join pour les catégorie car je pense qu'il y en a forcement et peut être aussi pour les membres
Je n'ai pas encore testé par manque de temps, je testerais ça demain et je te dirais :)