sql >> Databasteknik >  >> RDS >> Mysql

SQL- Välj den mest liknande produkten

Prova detta

SELECT 
  a_product_id, 
  COALESCE( b_product_id, 'no_matchs_found' ) AS closest_product_match
FROM (
  SELECT 
    *,  
    @row_num := IF(@prev_value=A_product_id,@row_num+1,1) AS row_num,
    @prev_value := a_product_id
  FROM 
    (SELECT @prev_value := 0) r
    JOIN (
        SELECT 
         a.product_id as a_product_id,
         b.product_id as b_product_id,
         count( distinct b.Attributes ),
         count( distinct b2.Attributes ) as total_products
        FROM
          products a
          LEFT JOIN products b ON ( a.Attributes = b.Attributes AND a.product_id <> b.product_id )
          LEFT JOIN products b2 ON ( b2.product_id = b.product_id )
       /*WHERE */
         /*  a.product_id = 3 */
        GROUP BY
         a.product_id,
         b.product_id
        ORDER BY 
          1, 3 desc, 4
  ) t
) t2 
WHERE 
  row_num = 1

Ovanstående query får de closest matches för alla produkter kan du inkludera product_id i den innersta frågan för att få resultaten för ett visst product_id , jag har använt LEFT JOIN så att även om en product har inga matchningar, den visas

SQLFIDDLE

Hoppas detta hjälper



  1. C++ Program som kommunicerar med MySQL Database

  2. En lösning för:Markörer stöds inte i en tabell som har ett klustrat kolumnlagerindex

  3. Hur kan jag ha MySQL-loggschemalagda händelser?

  4. SQL-uppdatering från en tabell till en annan baserat på en ID-matchning