Переписать, чтобы не включать подзапрос в FROM?

#mysql #sql #subquery

#mysql #sql #подзапрос

Вопрос:

Отличный парень помог мне с разработкой следующего утверждения. Однако в MySQL — я не могу сохранить представление с подзапросом в предложении FROM . Любые предложения о том, как переписать это, чтобы его можно было сохранить на сервере MySQL?

 SELECT  t.idPatternMetadata, SUBSTRING_INDEX(SUBSTRING_INDEX(t.sKeywords, ',', n.n), ',', -1) color , count(*) as counts
  FROM tblPatternMetadata t CROSS JOIN 
(
   SELECT a.N   b.N * 10   1 n
     FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b

    ORDER BY n
) n
 WHERE n.n <= 1   (LENGTH(t.sKeywords) - LENGTH(REPLACE(t.sKeywords, ',', '')))
group by color
  

Заранее спасибо!

Ответ №1:

Один из вариантов — создать таблицу, содержащую 100 целочисленных значений, и ссылаться на эту таблицу в запросе.

 CREATE TABLE n (n INT UNSIGNED PRIMARY KEY);

INSERT INTO n (n) 
SELECT a.n   b.n * 10   1 n
  FROM ( SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
         UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
         UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
       ) a
 CROSS
  JOIN ( SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
         UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
         UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
       ) b
 ORDER BY 1;
  

Затем перепишите свой запрос, чтобы ссылаться на таблицу вместо встроенного представления:

 SELECT  t.idPatternMetadata, SUBSTRING_INDEX(SUBSTRING_INDEX(t.sKeywords, ',', n.n), ',', -1) AS color 
     , count(*) AS counts
  FROM tblPatternMetadata t
  JOIN n 
    ON n.n <= 1   (LENGTH(t.sKeywords) - LENGTH(REPLACE(t.sKeywords, ',', '')))
 GROUP BY color