web-dev-qa-db-fra.com

Construire une requête avec JOIN, mais filtrer et trier cette table jointe en premier

Je construis un composant personnalisé dans Joomla 3.x. J'ai deux tables dans mon modèle:

table persons  
id  name 
1   Peter
2   Paul
3   Mary

table cars
id  personid  make     price
1   1         BMW      10,000
2   1         Audi     8,000
3   1         BMW      6,000
4   2         BMW      21,000

Maintenant, j'aimerais construire une requête renvoyant les personnes et leur BMW la moins chère:

Peter  BMW  6,000
Paul   BMW  21,000

Voici la déclaration MySQL que je peux trouver:

SELECT p.name, c.make, c.price 
FROM persons AS p 
LEFT JOIN cars AS c ON c.personid = p.id

Traduit en Joomla:

$db    = $this->getDbo();
$query = $db->getQuery(true);

$query->select('p.name, c.make, c.price');
$query->from('#__persons AS p');
$query->join('LEFT', '#__cars AS c ON c.personid = p.id');

Mais évidemment, j’ai d’abord - avant JOINing - besoin de filtrer Audi de Peter (WHERE c.make = 'BMW') et triez les BMW restantes en fonction de leur prix (ORDER BY c.price ASC).
Mais comment? Je suis coincé là-dessus et j'ai vraiment besoin de conseils.

1
michi

Si tout ce que vous voulez faire est d’ajouter la clause WHERE qui n’est pas différente de celle de toute autre requête DB Query for Joomla. Vous devrez regrouper les éléments en fonction de votre utilisateur et interroger le prix MIN. L'exemple ci-dessous devrait fonctionner pour vous. J'ai également inclus un lien SQL Fiddle ci-dessous).

$db    = $this->getDbo();
$query = $db->getQuery(true);
$query->select('p.name, c.make, MIN(c.price)');
$query->from('#__persons AS p');
$query->join('LEFT', '#__cars AS c ON c.personid = p.id');
$query->where("c.make = 'BMW'");
$query->group('p.id');

J'ai modifié votre requête pour inclure le MIN (c.price). Notez que j'ai regroupé l'instruction par p.id au lieu de la commande par c.price ASC.

Vous pouvez voir les résultats de cette requête at this SQLFiddle

1
Terry Carter