2017-07-12 1 views
0

Nous avons une table- Product_table:MySQL: Comment obtenir la dernière ligne sur la clause facultative where en utilisant group by?

product_id | company_id | Status | must_show 
1   | 23   | 1  | 1 
2   | 23   | 1  | 1 
3   | 23   | 1  | 0 
4   | 23   | 1  | 0 
5   | 23   | 0  | 0 
6   | 24   | 1  | 0 
7   | 24   | 1  | 0 
8   | 24   | 1  | 0 
9   | 24   | 1  | 0 
10   | 24   | 0  | 0 

Nous devons trouver le max product_id de la société où status is 1. Pour cela, nous utilisons ci-dessous requête:

select * from Product_table as pt 
JOIN (select MAX(product_id) as extid from Product_table) t1 ON t1.extid = 
pt.product_id where company_id in (23,24) and status = 1 group by company_id; 

Résultat:

product_id| company_id| Status | must_show 
4   | 23  | 1  | 0 
9   | 24  | 0  | 0 

Cette requête est bien, mais nous avons un problème ici.

  1. Si la valeur pour must_show is 1 alors nous avons besoin de montrer id max_product pour la société avec must_show = 1 et état = 1.
  2. Si la valeur pour must_show is 0 alors nous avons besoin d'afficher l'ID max_product pour la société avec status = 1.

Résultat attendu:

product_id| company_id| Status | must_show 
    2  | 23  | 1  | 1 
    9  | 24  | 1  | 0 

S'il vous plaît donnez-moi le chemin pour trouver une solution. Merci!

+0

Pour 'product_id = 10, le statut est 0' alors pourquoi voulez-vous le montrer? Vous avez mentionné que - 'Nous devons trouver le max. Product_id de la société où le statut est 1. 'Alors pourquoi enregistrer avec product_id = 10 est là dans le résultat attendu? –

+0

Oui, quand il y a 1 dans must_show, nous devons montrer cet enregistrement. En fait changer la priorité. –

+0

Je parle de 'product_id = 10'. Pour cet enregistrement 'status' et' must_show' les deux sont 0. –

Répondre

0

S'il vous plaît essayer ci-dessous requête:

select max(t.product_id) product_id, t.company_id, t.status, t.must_show from 
(select p1.product_id, p1.company_id, p1.status, p1.must_show 
    from product_table p1 
    where status = 1 
    and must_show = (
     select max(must_show) from product_table p2 where p2.company_id = p1.company_id) 
) as t group by t.company_id; 

Sortie:

+------------+------------+--------+-----------+ 
| product_id | company_id | status | must_show | 
+------------+------------+--------+-----------+ 
|   2 |   23 |  1 |   1 | 
|   9 |   24 |  1 |   0 | 
+------------+------------+--------+-----------+ 

company_id in (23,24) - Je pense que vous n'avez pas besoin cette condition car il n'y a que ces deux présents company_id dans votre table selon les données de votre question.

+0

Merci! Je l'ai. Cela peut réduire la vitesse de la page mais fonctionne. –