L'accès à une table temporaire à plusieurs reprises dans MySql
J'ai essayé d'utiliser une table temporaire comme un résultat intermédiaire titulaire d'une instruction SELECT. Le problème, c'est que je ne peux pas accéder à la table temp à plusieurs reprises dans d'autres requêtes, déclaration qui, je l'espère, être possible c'est à dire fait de la de la table temporaire inutile.
Est-il une alternative à des tables temporaires dans MySql qui me permet de m'extraire de mon instruction SQL.
Je ne peux pas utiliser les procédures de la banque (ne peut pas y accéder à partir de la web-framework version utilisée dans l'entreprise) et je ne veux pas utiliser un curseur.
Edit:
Bien mon code ressemble à ceci:
Temp la création de la table:
CREATE TEMPORARY TABLE dates_with_entries (
seq INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
datum VARCHAR(32)
);
INSERT INTO dates_with_entries (datum) SELECT datum AS Datum from project_times
WHERE user_id = 20 GROUP BY datum ORDER BY datum desc LIMIT 13;
Le code où j'utilise mon temp tableau ressemble un peu à ça (je simpled vers le bas pour le problème que j'ai..)
SELECT
...
FROM (SELECT entrie_date AS datum FROM dates_with_entries ) AS sub_result
INNER JOIN project_times
ON sub_result.datum = project_times.datum AND project_times.user_id = 20
LEFT JOIN works AS w ON project_times.work_id = w.id
LEFT JOIN sub_projects AS sp ON sp.id = w.sub_project_id
LEFT JOIN projects AS p ON p.id = sp.project_id
GROUP BY datum
UNION(
SELECT
..
FROM (SELECT entrie_date AS datum FROM dates_with_entries ) AS sub_result
INNER JOIN project_times AS pt ON pt.datum = sub_result.datum
INNER JOIN works AS w on w.id = pt.work_id
INNER JOIN sub_projects AS sp on w.sub_project_id = sp.id
INNER JOIN projects AS p ON sp.project_id = p.id
WHERE pt.user_id = 20
);
Les numéros seront remplacées plus tard par des rubis, c'est uniquement pour les tests de l'instruction SQL.
OriginalL'auteur Mark | 2010-11-02
Vous devez vous connecter pour publier un commentaire.
Un moyen de contourner cela est de simplement créer un "vrai" tableau, plutôt que d'une table temporaire.
Les avantages que les tables temporaires de l'offre:
les tables temporaires avec le même nom
dans le cadre de sessions distinctes.
c'. Il disparaît lorsque vous mettez fin à votre session
Si #1 est crucial pour vous, alors vous avez probablement besoin de coller avec des tables temporaires. Sinon, si une seule instance de ce programme s'exécute à un moment, ou si vous créez le nom de la table de manière dynamique afin de la rendre unique, je vous recommande de choisir en conséquence le nom unique pour ce tableau et de le créer comme une "vraie" table, puis déposez-la lorsque vous avez terminé.
Si vous savez déjà ce que la requête va ressembler, créer une deuxième table temporaire avec un schéma identique à la première table temporaire, puis de faire un
INSERT INTO dates_with_entries2 SELECT * FROM dates_with_entires
, et enfin, dans votre ultime requête, reportez-vous à la première table temporaire à un endroit, et la deuxième table temporaire dans l'autre.OriginalL'auteur Ike Walker
Bug connu (fonction) - lire http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html
Voici comment j'ai contourner le problème...
OriginalL'auteur Jon Black
Pour ce problème, où la table temporaire est seulement à lire, j'ai créer un deuxième table temporaire comme une copie de la première puis de l'utiliser dans la requête:
Puis
OriginalL'auteur Nikkorian
J'ai essayé "AVEC" pour ce problème, mais apparemment, il n'est pas pris en charge par MySQL sur mon serveur. Je suis tombé sur cette solution qui semble fonctionner. Il utilise des "CRÉER une VUE" à reproduire "AVEC" MySQL
http://guilhembichot.blogspot.com/2013/11/with-recursive-and-mysql.html
OriginalL'auteur Amin MousaviNejad