sql >> Databáze >  >> RDS >> Mysql

MySQL Nejlepší N výsledky se spojením tabulek

Myslím, že jsem to vyřešil :)

Nejprve je zde jedno řešení založené na tom, jak jste začali. Ale je tu háček, nedokázal jsem to vyřešit, abych ukázal přesné 3 (nebo jakékoli číslo, které zvolíte, například vyberu 3) řádek pro každé person_id. Problém je v tom, že řešení je založeno na počítání, kolik řádků je tam s rating_average větší než aktuální řádek. Takže pokud máte 5 stejných nejvyšších hodnot, můžete si vybrat, zda chcete zobrazit všech 5, nebo je nezobrazovat vůbec, a to není dobré. Takže tady je způsob, jak to udělat... (samozřejmě toto je příklad, kdy pokud máte 4 nejvyšší hodnoty, zobrazíte je všechny (myslím, že nemá smysl data neukazovat))...

 SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average
 FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id, 
              m.rating_average AS rating_average
       FROM person p
       INNER JOIN credit c ON c.person_id = p.id
       INNER JOIN media m ON m.id = c.media_id) as t1
 WHERE (SELECT COUNT(*) 
       FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id, 
                    m.rating_average AS rating_average
             FROM person p
             INNER JOIN credit c ON c.person_id = p.id
             INNER JOIN media m ON m.id = c.media_id) AS t2
       WHERE t2.person_id = t1.person_id AND t2.rating_average > t1.rating_average) < 3
 ORDER BY person_id ASC, rating_average DESC

Důležité: Toto řešení může fungovat (ukázat přesně 3 řádky pro každou osobu), pokud nemáte hodnotu, která se sama opakuje... Zde je Fiddle http://sqlfiddle.com/#!9/eb0fd/64 můžete vidět problém, kde person_id je 1!

Potom jsem hrál trochu víc a nechal jsem to fungovat tak, jak jste chtěli v otázce, myslím. Zde je kód:

SET @num := 0, @person := 0;

SELECT person_id, credit_id, media_id, rating_average, rowNumber 
FROM (SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average,
             @num := if(@person = t1.person_id, @num + 1, 1) AS rowNumber,
             @person := t1.person_id
      FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id, 
                   m.rating_average AS rating_average
            FROM person p
            INNER JOIN credit c ON c.person_id = p.id
            INNER JOIN media m ON m.id = c.media_id
            ORDER BY p.id ASC, m.rating_average DESC) as t1) as t2
 WHERE rowNumber <= 3

Zde jsou housle pro toto http://sqlfiddle.com/#!9/eb0fd/65 ...

GL!

P. S. omlouvám se za moji angličtinu, doufám, že rozumíte tomu, o čem mluvím...




  1. Jaké jsou rozdíly mezi zpětným zaškrtnutím a jednoduchou uvozovkou? Mohu použít příkaz IF v dotazu, jak je uvedeno výše?

  2. Je to bezpečná metoda pro vkládání dat formuláře do databáze MySQL?

  3. Vysvětlete Plán Cost Pain Point

  4. Standardy pro přidání data/času?