150 votes

Comment utilisez-vous le "AVEC" clause dans MySQL?

Je suis de la conversion de toutes mes requêtes SQL Server MySQL et de mes requêtes WITH sont défaillants. Voici un exemple:

WITH t1 AS
(
     SELECT article.*, userinfo.*, category.*
     FROM question
     INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
     INNER JOIN category ON article.article_categoryid = category.catid
     WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3

179voto

OMG Ponies Points 144785

MySQL ne supporte pas la clause (CTE dans SQL Server langage; sous-Requête d'Affacturage dans Oracle), de sorte que vous êtes de gauche avec l'aide de:

  • Les tables TEMPORAIRES
  • Les tables DÉRIVÉES
  • inline points de vue (ce que la clause représente - ils sont interchangeables)

La demande pour la fonction remonte à 2006.

Comme mentionné, vous avez fourni un mauvais exemple - il n'y a pas besoin d'effectuer une sous-sélection si vous n'êtes pas altérer la sortie des colonnes en quelque sorte:

  SELECT * 
    FROM ARTICLE t
    JOIN USERINFO ui ON ui.user_userid = t.article_ownerid
    JOIN CATEGORY c ON c.catid =  t.article_categoryid
   WHERE t.published_ind = 0
ORDER BY t.article_date DESC 
   LIMIT 1, 3

Voici un exemple:

SELECT t.name,
       t.num
  FROM TABLE t
  JOIN (SELECT c.id
               COUNT(*) 'num'
          FROM TABLE c
         WHERE c.column = 'a'
      GROUP BY c.id) ta ON ta.id = t.id

22voto

astander Points 83138

Dans Sql avec l'instruction spécifie un ensemble de résultats nommé temporaire, connu comme une expression de table commune (CTE). Il peut être utilisé pour les requêtes récursives, mais dans ce cas, il spécifie en tant que sous-ensemble. Si mysql permet subselectes je voudrais essayer

select t1.* 
from  (
    		SELECT	article.*, 
    				userinfo.*, 
    				category.* 
    		FROM	question INNER JOIN 
    				userinfo ON userinfo.user_userid=article.article_ownerid INNER JOIN category ON article.article_categoryid=category.catid
    		WHERE	article.article_isdeleted = 0
     ) t1
ORDER BY t1.article_date DESC Limit 1, 3

5voto

Kanagu Points 120

'Expression de Table commune, la fonction n'est pas disponible dans mysql, de sorte que vous avez à faire pour faire une vue ou une table temporaire pour résoudre, ici j'ai utilisé une table temporaire

La procédure stockée mentionné ici pour résoudre votre besoin. Si je veux obtenir tous les membres de mon équipe et de leurs membres associés, Cette procédure stockée defenetely aider à u

----------------------------------
user_id | team_id
----------------------------------
admin | NULL
ramu | admin
suresh | admin
kumar | ramu.
mahesh | ramu.
randiv | suresh
-----------------------------------

DROP PROCEDURE `user_hier`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `user_hier`(in team_id varchar(50))
BEGIN
declare count int;
declare tmp_team_id varchar(50);
CREATE TEMPORARY TABLE res_hier(user_id varchar(50),team_id varchar(50))engine=memory;
CREATE TEMPORARY TABLE tmp_hier(user_id varchar(50),team_id varchar(50))engine=memory;
set tmp_team_id = team_id;
SELECT COUNT(*) INTO count FROM user_table WHERE user_table.team_id=tmp_team_id;
WHILE count>0 DO
insert into res_hier select user_table.user_id,user_table.team_id from user_table where user_table.team_id=tmp_team_id;
insert into tmp_hier select user_table.user_id,user_table.team_id from user_table where user_table.team_id=tmp_team_id;
select user_id into tmp_team_id from tmp_hier limit 0,1;
select count(*) into count from tmp_hier;
delete from tmp_hier where user_id=tmp_team_id;
end while;
select * from res_hier;
drop temporary table if exists res_hier;
drop temporary table if exists tmp_hier;
end

mysql>appel user_hier ('admin')//

J'espère que ce code permettra à tous les

2voto

JeremyWeir Points 9424

Cette fonction est appelée une expression de table commune http://msdn.microsoft.com/en-us/library/ms190766.aspx

Vous ne serez pas en mesure de faire exactement la chose à mySQL, la chose la plus simple serait probablement faire un point de vue que les miroirs, CTE et il suffit de sélectionner à partir de la vue. Vous pouvez le faire avec les sous-requêtes, mais qui va effectuer vraiment mal. Si vous rencontrez des expressions de table communes qui ne la récursivité, je ne sais pas comment vous seriez en mesure de recréer que sans l'aide de procédures stockées.

EDIT: Comme je l'ai dit dans mon commentaire, que l'exemple que vous avez posté n'a pas besoin d'un CTE, de sorte que vous devez avoir simplifié pour la question, car il peut être écrit comme

SELECT article.*, userinfo.*, category.* FROM question
     INNER JOIN userinfo ON userinfo.user_userid=article.article_ownerid
     INNER JOIN category ON article.article_categoryid=category.catid
     WHERE article.article_isdeleted = 0
 ORDER BY article_date DESC Limit 1, 3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X