8791 sujets

Développement web côté serveur, CMS

hello, je voudrais faire une requête un peu spéciale :

-j'ai deux tables : posts & traducs.
La table contient les champs |post_id|language_id|translation_group|
Elle me sert à stocker tous les ids des posts avec leur langue (1,2 ou 3) et le groupe d'articles dont il fait partie, si ils ont été traduits.

Maintenant, je voudrais faire une requête de sorte que, à partir d'un ID donné (le $post_id de ma fonction ci-dessous); ma requête sélectionne la ligne correspondant à l'article traduit de l'ID donné.

Donc si mon post #5 est une traduction anglaise de mon post #1; je voudrais qu'en utilisant gengoGetAPost (1), il me retourne la ligne correspondant à post_id 5 dans la table posts.

Il faudrait donc, à l'intérieur de la requête,
-récupérer le translation_group de l'ID donné
-le comparer à un autre ligne
---qui a le même translation_group
---dont le language_id est 2 (dans le cas de l'anglais)
- isoler la valeur du champs post_id de cette table et aller extraire de la table posts la ligne correspondante.

J'ai commencé à plancher sur le truc, mais c'est dur ! Ceci ne marche pas encore, je sais pas ou placer translation_group...

function gengoGetAPost($post_id) {
	$language_ids = 2; //2 = langue anglaise

	$query = "SELECT p.* FROM posts AS p INNER JOIN traducs AS p2l ON p.ID = p2l.post_id WHERE p2l.language_id IN ($language_ids) AND p2l.post_id='".$post_id."' LIMIT 1";

	return ($result = $wpdb->get_row($query)) ? $result : NULL;
}


Merci pour votre aide !
Modifié par gordie (16 Oct 2007 - 17:35)
Salut,

question bête : ce ne serait pas plus simple de n'avoir qu'une table posts avec un post_id commun pour un même message et éventuellement plusieurs enregistrements si le message possède une traduction [avec éventuellement un booléen pour dire si c'est le message d'origine], ce qui donnerait :
[b]post_id		language_id		originel	message[/b]
1		1		true	'Mon nom est Pierre'
1		2		false	'My name is Peter'
...
?
Salut

+1 pour Heyoan

Ou alors on pourrait garder une table pour les articles originaux, et utiliser une table pour les traductions. Sachant qu'un article peut avoir plusieurs traductions mais que chaque traduction ne correspond qu'à un article (liaison 1 - plusieurs), il te faut juste une clé étrangère "post_id" dans la table "traductions" pour récupérer tout ce que tu veux ...
en fait c'est l'édition d'un wordpress, du coup je chipote avec les tables du plugin (post2lang) et pas de wordpress itself....
Salut,
gordie a écrit :
en fait c'est l'édition d'un wordpress, du coup je chipote avec les tables du plugin (post2lang) et pas de wordpress itself....

Pas compris Smiley rolleyes ! Cela veut dire que tu ne peux (veux) pas modifier les tables existantes ?
ben oui je peux pas, car si je met à jour wordpress je risque d'avoir des problèmes.

J'essaie de modifier le minimum.. En l'occurence, ici c'est dans un fichier destiné à répertorier les fonctions ajoutées par l'utilisateur.

J'ai avancé dans ma fonction :

SELECT p.*
FROM wp_posts AS p

INNER JOIN wp_post2lang AS p2l
ON p.ID = p2l.post_id

WHERE p2l.translation_group='5' AND p2l.language_id='2' LIMIT 1;


Ici il me sort le post qui a comme translation_group 5 et comme language_id 2.

La seule chose qui me manque est qu'il ne dois pas faire
WHERE p2l.translation_group='5'
mais
WHERE p2l.translation_group=la-valeur-de-translation_group-du-post_id-envoyé-dans-la-fonction
Quelle est la notion de translation_group ? Est-ce le lien entre les posts qui sont une traduction d'un même message ?

Et sinon tu pourrais (re)dire comment fonctionnent les tables ? Est-ce que par exemple tu as :
[b]posts[/b]
id = 1
message = 'mon nom est Pierre'
group = 5 

id = 5
message = 'my name is Peter'
group = 5 




[b]traducs[/b]
post_id = 5 // id du post traduit dans la table posts
language_id = 2 // anglais
translation_group = 5

Si c'est bien le cas tu pourrais faire :
$query = "SELECT message FROM posts, traducs WHERE id = post_id and language_id = $language_ids 
and translation_group = (SELECT group FROM posts where id = $id)";


Si ta version de PHP n'autorise pas les requêtes imbriquées, il faudra en faire 2 !

A+
Salut, j'ai donc ma table posts
|ID|...|....
post2lang
|POST_ID|LANGUAGE_ID|TRANSLATION_GROUP.

Si un article est 'seul', translation_group=0.
Si un article possède une ou plusieurs traductions, tous les articles liés ont le même translation_group.

J'ai réussi à construire ma requête, il me manque juste un truc (exemple dans phpmyadmin) :

SELECT p . *
FROM wp_posts AS p
INNER JOIN wp_post2lang AS p2l ON p.ID = p2l.post_id
INNER JOIN wp_post2lang AS p3l ON p3l.post_id = '145'
WHERE p.post_date <= '2007-10-17 06:24:25'
AND p.post_status = 'publish'
[b]AND p2l.translation_group = p3l.translation_group[/b]
AND p2l.language_id
IN ( 1 )
LIMIT 1 


> AND p2l.translation_group = p3l.translation_group
il faudrait que ce soit uniquement si translation_group !=0

On peut faire des conditions en sql ?

avec
AND p2l.translation_group = p3l.translation_group AND p2l.translation_group != 0, ça marche pas...
Modifié par gordie (17 Oct 2007 - 15:41)
gordie a écrit :
Salut, j'ai donc ma table posts
|ID|...|....
post2lang
|POST_ID|LANGUAGE_ID|TRANSLATION_GROUP.

Si un article est 'seul', translation_group=0.
Si un article possède une ou plusieurs traductions, tous les articles liés ont le même translation_group.

Ah OK !

Alors tu pourrais faire :
<?php
function gengoGetAPost($id) {
	$language_ids = 2; //2 = langue anglaise
	$query="SELECT message FROM posts, post2lang WHERE id = post_id and language_id = $language_ids 
	and translation_group = (SELECT translation_group FROM post2lang  where post_id = $id)";
	return ($result = $wpdb->get_row($query)) ? $result : NULL;
}
?>


Sinon :

* remplacer "!=" par "<>"

* pour la condition il suffirait de rajouter "AND p2l.translation_group <> 0". Dans d'autres cas, regarder du côté de "SELECT ... CASE ... WHEN ... THEN ..." (exemples sur cette page)

* je ne vois pas bien l'interêt du INNER JOIN mais c'est juste par habitude.

* le IN sert à regrouper plusieurs valeurs possibles "... IN (1, 2, 3)" donc s'il n'y en a qu'une un égal "... = 1" sera plus optimisé...

A+
Modifié par Heyoan (17 Oct 2007 - 16:30)