Aller au contenu

Vikchill

Actif
  • Compteur de contenus

    15
  • Inscrit(e) le

  • Dernière visite

Messages postés par Vikchill

  1. Ah bah oui c'était peut-être simplement les alias qu'il n'aimait pas, cette requête a plus de chance de fonctionner.

    Sinon, passer par une vue au lieu d'une requête imbriquée, mais je sais pas si MySQL gère les vues, et ça devient très "bidouille".

  2. blblblbl J'arrive pas à comprendre pourquoi le HAVING marche pas :(

    Et un SELECT sur le SELECT?

    SELECT *
    FROM (SELECT c.Id_Client, SUM(a.Id_Categorie IN (8,9)) AS 'Recherche', SUM(a.Id_Categorie IN (10,4)) AS 'Exclusion'
    FROM Commandes c
    INNER JOIN Produit p ON p.Id_Commande = c.Id_Commande
    INNER JOIN Article a ON a.Id_Article = p.Id_Article
    WHERE c.Id_Client = 123456
    GROUP BY c.Id_Client)
    WHERE 'Recherche' > 0
    AND 'Exclusion' = 0

  3. Ou ça ;)

    SELECT
    c.Id_Client,
    SUM(a.Id_Categorie IN (8,9)) AS 'Recherche',
    SUM(a.Id_Categorie IN (10,4)) AS 'Exclusion'
    FROM Commandes c
    INNER JOIN Produit p ON p.Id_Commande = c.Id_Commande
    INNER JOIN Article a ON a.Id_Article = p.Id_Article
    WHERE c.Id_Client = 123456
    GROUP BY c.Id_Client
    HAVING 'Recherche' > 0
    AND 'Exclusion' = 0

    On pense trop rarement au HAVING. Dis-nous ce que ça donne :)

  4. La grosse requète qui combine TOPIC par date et TOPIC par date de réponse produit une erreur. Merci quand même.

    Faudrait nous aider un peu aussi :wacko: Quelle erreur? As-tu aussi testé les requêtes individuellement?

    Je me souviens d'un exemple qui répondait à mes besoins dans lequel on ne triait pas par date, mais par ID pour connaitre le dernier d'un topic donné.

    Curieusement, cette requète était beaucoup plus légère.

    Je n'ai toujours pas la structure de ta table, ni comment elle est gérée. Si effectivement ton champs id est incrémental, nul besoin de date puisque les id sont forcément classés dans l'ordre chronologique.

    Ne peut on pas plus simplement faire une requete qui trie les TOPIC NULL et NOT NULL (avec et sans réponse combinés) PAR DATE (soit de DATE TOPIC soit de DATE reponse) ?

    je patauge :/

    On peut à peu près tout faire, mais donner plus d'éléments serait peut-être bien, là on navigue un peu en aveugle :)

    En attendant, essaie ces trois requêtes et dis voir si elle fonctionnent si tu veux bien:

    - posts avec réponse:

    SELECT DISTINCT topic
    FROM table

    - posts sans réponse:

    SELECT id
    FROM table
    WHERE id NOT in (SELECT DISTINCT topic
    FROM table)

    - dernière réponse de chaque post:

    SELECT topic, MAX(id)
    FROM table
    WHERE id in (SELECT DISTINCT topic
    FROM table)
    GROUP BY topic

  5. L'union des deux SELECT imbriqués ajoute leurs résultats, pour ça il faut qu'on ait les mêmes colonnes dans les deux requêtes. Les enregistrement retournés ne sont pas triés, d'où l'imbrication qui ne sert qu'à faire le tri, mais j'ai un doute sur sa necessité, mais comme je ne peux pas tester :s

  6. Alors, allons-y par étape, en éspérant que j'ai bien compris ton message.

    Ce que tu appelles un topic sans réponse est en fait un "id" qu'on a jamais dans le champs "topic":

    SELECT id, date
    FROM table
    WHERE id NOT IN (SELECT topic
    FROM table
    )
    ORDER BY date DESC

    Cette requête devrait répondre à ta première demande.

    Pour la deuxième, c'est le contraire, il faut prendre uniquement les "id" qu'ont retrouve dans le champs "topic" en ne prenant que la plus grande date:

    SELECT id, date
    FROM table
    WHERE id IN (SELECT topic
    FROM table
    )
    AND date = (SELECT MAX(date)
    FROM table t
    WHERE table.id=t.id
    )
    ORDER BY date DESC

    Tu veux l'union des deux, classée par date, donc ça devrait donner:

    SELECT *
    FROM (SELECT id, date
    FROM table
    WHERE id NOT IN (SELECT topic
    FROM table
    )

    UNION ALL

    SELECT id, date
    FROM table
    WHERE id IN (SELECT topic
    FROM table
    )
    AND date = (SELECT MAX(date)
    FROM table t
    WHERE table.id=t.id
    )
    )
    ORDER BY date DESC

    N'ayant ni la structure de ta base, ni aucun moyen de tester tout ça, ça reste à prendre avec des pincettes. Tu diras ce que ça donne :)

  7. L'idéal est d'avoir toutes tes informations dans plusieurs tables puis de créer les tables qui les associent et qui, elles, contiendront les information. En gros, dans une table "ville" tu mets les enregistrements "Paris", "Marseille", "Lyon", dans une table "metier_art" tu mets "arts textiles", "tapisserie", "lingerie de luxe". Finalement tu crées une table "métier_ville" avec deux champs "ville" et "métier" dans laquelle tu auras les enregistrements "Paris;art textiles", "Paris;tapisserie", "Lyon;lingerie de luxe", c'est de cette table que tu tires l'information. Une simple requête en selectionnant la ville que tu veux te donnera tous les métiers d'art de la ville.

    Ceci te permets aussi de faire des formulaires avec liste déroulante qui facilitera tes recherches et tes saisies puisque toutes les informations seront écrites avec la même orthographe. Le problème typique d'une base de données sans ce genre de contrôle est que quand tu cherches une voiture de couleur verte, certains auront saisi "vert", d'autre "Vert", "verre", "vers", etc... Et jamais tu ne retrouves toutes tes informations.

    Là j'ai simplifié à l'extrême, ce ne sera pas forcément optimisé et déjà il te faudra une bonne maitrise de SQL pour travailler ta base de données.

×
×
  • Créer...