Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure entre plusieurs tables

Sujet résolu
25 mars 2019 à 19:22:06

Bonjour,

Je suis en train de faire une boutique en ligne et je voulais faire un historique d'achat de la boutique pour un serveur de jeu. Mais je sais pas par où commencer ma requête...

Du coup voici les tables (avec seulement les données à récupérer) :

             - members : dategrade,

             - last_shop_operations : dateadd,

             - boutique_items : name, price, category

J'ai bien tenté de m'inspirer de cette requête, que j'ai faite pour une jointure plus simple, mais sans succès :

SELECT 
	points.count AS count, 
	DATE_FORMAT(last_credit_operations.dateadd, '%d/%m/%Y') AS dateadd,
	last_credit_operations.status AS status
FROM last_credit_operations 
INNER JOIN points 
	ON points.id = last_credit_operations.idcredit
WHERE last_credit_operations.iduser=?
ORDER BY last_credit_operations.id DESC LIMIT 10

Merci d'avance pour votre aide !

  • Partager sur Facebook
  • Partager sur Twitter
26 mars 2019 à 12:06:46

Bonjour,

Manque de précisions

Afin d'obtenir de l'aide et une solution à votre problème, il est fortement recommandé de présenter clairement l'état actuel du problème en nous fournissant :

  • Un descriptif clair et précis du problème
  • La tentative actuelle de résolution que vous avez effectué
  • Le résultat attendu et le résultat actuel
  • Toutes pistes de recherches pouvant aider à la résolution

En l'état, sans la structure de tes tables (clés primaires et étrangères notamment) il est difficile de comprendre ce que tu fais et comment t'aider à obtenir ce que tu veux. Un exemple de résultat attendu par exemple ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
26 mars 2019 à 12:39:03

Bonjour,

quel est la structure de ces 3 tables ( en précisant les colonnes qui doit servir à la jointure ) ?

  • Partager sur Facebook
  • Partager sur Twitter
Si vous voulez aller vite, partez seul; si vous voulez aller loin, faites-vous accompagner
26 mars 2019 à 17:37:27

Bonjour,

Excusez moi du manque de précision, je débute en SQL. Pour ce qui est de la structure de mes tables :

    - table boutique_items

id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT
name VARCHAR(100) NOT NULL
category TINYINT(4) UNSIGNED NOT NULL
price SMALLINT(5) UNSIGNED NOT NULL
timelimit SMALLINT(5) UNSIGNED NOT NULL
image VARCHAR(500) NULL
description TEXT NOT NULL
dateadd	DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

    - table last_shop_operations

id INT(10) UNSIGNED NOT NULL PRIMARY KEY
iditem INT(10) UNSIGNED NOT NULL
iduser INT(10) UNSIGNED NOT NULL
dateadd DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

   - table members

id INT(10) UNSIGNED NOT NULL PRIMARY KEY
username VARCHAR(50) NOT NULL
password VARCHAR(255) NOT NULL
grade TINYINT(4) NOT NULL DEFAULT 0
dategrade DATETIME NULL
skin VARCHAR(500) NULL
image VARCHAR(500) NULL
votes INT(11) NOT NULL DEFAULT 0
balance	SMALLINT(6) NOT NULL UNSIGNED DEFAULT 0
dateadd	DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

Voici une requête que j'ai faite, avec une jointure entre boutique_items et last_shop_operations :

SELECT
   boutique_items.name AS name,
   boutique_items.category AS category,
   boutique_items.price AS price,
   DATE_FORMAT(
        last_shop_operations.dateadd,
        '%d/%m/%Y'
    ) AS dateadd
FROM
    boutique_items
INNER JOIN last_shop_operations ON boutique_items.id = last_shop_operations.iditem
WHERE
    last_shop_operations.iduser = ?
ORDER BY
    last_shop_operations.id
DESC
LIMIT 10

J'obtiens comme ça les colonnes que je voulais des tables boutique_items et last_shop_operations, mais j'ai besoin d'ajouter la colonne dategrade de la table members. J'ai essayé d'intégrer une sous requête mais je sais pas où la mettre :/.

Je code en PHP et cette requête est censée être préparée, avec comme paramêtre l'id de l'utilisateur que j'obtiens via la session.

Merci encore!

EDIT : J'ai tenté cette requête :

SELECT
    tab.name,
    tab.category,
    tab.price,
    tab.dateadd,
    members.dateadd
FROM
    (
    SELECT
        boutique_items.name AS NAME,
        boutique_items.category AS category,
        boutique_items.price AS price,
        last_shop_operations.iduser AS iduser,
        DATE_FORMAT(
            last_shop_operations.dateadd,
            '%d/%m/%Y'
        ) AS dateadd
    FROM
        boutique_items
    INNER JOIN last_shop_operations ON boutique_items.id = last_shop_operations.iditem
) AS tab
INNER JOIN members ON members.id = tab.iduser
WHERE
    tab.iduser = 3
ORDER BY
    tab.iduser
DESC
LIMIT 10

Elle fonctionne comme prévu, mais je voudrai savoir si on peut faire mieux.

-
Edité par Giseline 26 mars 2019 à 17:49:14

  • Partager sur Facebook
  • Partager sur Twitter
26 mars 2019 à 17:58:42

Pourquoi faire une sous requête ?

Rajouter une jointure ne te donne pas le résultat attendu ?

SELECT
	I.name AS name,
	I.category AS category,
	I.price AS price,
	DATE_FORMAT( O.`dateadd`, '%d/%m/%Y' ) AS operation_date
	M.`dateadd` AS member_date
FROM
	boutique_items I
		INNER JOIN last_shop_operations O
			ON I.id = O.iditem
		INNER JOIN members M
			ON M.id = O.iduser
WHERE O.iduser = ?
ORDER BY O.id DESC
LIMIT 10
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
26 mars 2019 à 18:19:56

Nope via PDO et via l'interface de saisie sql, cette requête ne renvoie rien. :(
  • Partager sur Facebook
  • Partager sur Twitter
26 mars 2019 à 19:02:33

Si aucun résultat c'est que les conditions de jointure ne sont remplies pour aucun enregistrement.

Donc une des jointures n'est pas bonne et possiblement celle vers la table members...

Aucune opération n'a un iduser égal à un id de la table members...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
26 mars 2019 à 21:16:12

Non je veux dire qu'il renvoie une erreur :

Caractère inattendu. (near "?" at position 357)
Un alias a été constaté précédemment. (near "    M" at position 143)
Jeton inattendu. (near "    M" at position 143)
Jeton inattendu. (near "." at position 148)
Jeton inattendu. (near "`dateadd`" at position 149)
Mot clé non reconnu. (near "AS" at position 159)
Jeton inattendu. (near "member_date" at position 162)
Un alias a été constaté précédemment. (near "        INNER" at position 203)
Jeton inattendu. (near "        INNER" at position 203)
Un alias a été constaté précédemment. (near "            ON" at position 246)
Un alias a été constaté précédemment. (near "            ON" at position 308)

#1064 - Erreur de syntaxe près de '    M.`dateadd` AS member_date
FROM
    boutique_items I
      ' à la ligne 6

EDIT :

Je me suis renseigné, et j'ai réussi à comprendre comment ta requête fonctionnait, du coup j'ai pu la réécrire (parce que c'est plus simple que de chercher la faute, et ça marche comme prévu)

SELECT
    boutique_items.name AS nom,
    last_shop_operations.iduser AS iduser,
    boutique_items.category AS category,
    boutique_items.price AS price,
    last_shop_operations.dateadd AS entrydate
FROM boutique_items
INNER JOIN last_shop_operations ON last_shop_operations.iditem = boutique_items.id
INNER JOIN members ON members.id = last_shop_operations.iduser
WHERE
    members.id = ?

voici la requête finale.

Merci encore :D


-
Edité par Giseline 26 mars 2019 à 21:29:10

  • Partager sur Facebook
  • Partager sur Twitter
27 mars 2019 à 9:06:14

Si tu avais lu l'erreur plus consciencieusement tu aurais vu où elle se trouvait et constaté que j'avais simplement oublié une virgule à la fin de la ligne 5 de mon code ...

Car en soit, ta requête est la même que la mienne ...

Au passage, si cette dernière requête te satisfait, alors tu n'a pas besoin de la table members et de la jointure qui va avec. Tu pourrais simplement faire :

SELECT
	I.name AS nom,
	O.iduser AS iduser,
	I.category AS category,
	I.price AS price,
	O.dateadd AS entrydate
FROM
	boutique_items I
		INNER JOIN last_shop_operations O
			ON O.iditem = I.id
WHERE O.iduser = ?

Je remets le code avec les alias car cela facilite grandement l'écriture et la lecture de la requête ;)

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 mars 2019 à 17:22:41

Merci pour ton aide ! :D je veillerai à être plus consciencieux à l'avenir, du coup.
  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2020 à 12:09:23

Bonjour, j'étais entrain de faire entrain de réaliser la cartographie des zones d'intervention  des projets et programmes dans mon pays par département  toutefois, j'ai des difficultés avec le type de jointure. En effet, quand je fais la jointure seuls deux ou trois programmes sur 24 s'affichent et j'ai besoin de voir tous les projets et programmes par départements. Quelqu'un pour m'éclairer

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2020 à 12:36:58

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL