9
votes

Rejoignez deux tables dans MySQL, renvoyant une seule ligne de la deuxième table

J'ai deux tables: galerie et images:

galerie strong> p> xxx pré>

images strong> p>

id           int (auto increment, primary key)
picture      varchar
gallery_id   int (foreign key)


0 commentaires

3 Réponses :


13
votes

édité

Apparemment regroupement dans la base de données MySQL ferait le truc pour vous.

colonnes de base de données sont MAIN_ID, SUB_ID, SUB_MAIN_ID, SUB_DATA xxx

sans le groupe, j'ai ces enregistrements: xxx

après le groupement , Je reçois ce résultat: xxx


7 commentaires

J'utilise MySQL, j'ai édité le poteau, mon erreur de ne pas dire ça.


Le directeur est le même. Sélectionnez la première photo de votre photo d'abord. Vous pouvez accomplir cela en utilisant limite 1 . Utilisez ensuite cette question dans un rejoindre comme sous-requête.


Cela ne fonctionnerait pas dans MySQL. Vous devez mieux analyser cette cause à la fin au lieu de me donner plusieurs lignes contenant plusieurs rangées de la première table et un seul de la deuxième table qui renvoie une seule ligne, ce qui signifie que cela signifie que la déclaration de sélection interne a une ligne.


L'instruction SELECT INTERNET renvoie juste une seule ligne (en raison de cette limite 1 pas une ligne pour chaque ligne de la première table de la première table. 1 rangée seule. Alors, comment puis-je aller autour de cette limite 1 mais en sélectionnant toujours 1 rangée pour chaque ligne du premier table.


En fait, il est beaucoup plus simple que d'avoir imaginé d'abord. J'ai joué avec elle sur une base de données de test sur ma machine de développement et j'ai proposé la requête mise à jour ci-dessus.


J'ai proposé la solution d'ajouter un groupe par aussi mais je n'aime pas ce que cela montre lorsque je tape explique devant la requête. Cela fonctionnera mais car le nombre de galeries grandit cela va être très lent ou au moins alors je pense. N'hésitez pas à me contredire.


J'ai ajouté une nouvelle réponse qui pourrait vous aider. Pouvez-vous vérifier si cela fait ce dont vous avez besoin?



0
votes

deuxième option (sans regroupement) consiste à utiliser la numérotation de ligne interne et à limiter le numéro de ligne à la première occurrence.

xxx

espère que cela vous aide à vous aider à vous aider < / p>


0 commentaires

0
votes

solution 1 strong> La méthode que j'ai utilisée consiste à ajouter numéro de rangée forte> au résultat du sous-ensemble (dans notre cas images forge> requête) en utilisant rangée () forte> fonction alors Dans la condition de jointure, j'ai ajouté (rn = 1) ... ce serait quelque chose comme ce qui suit: xxx pré>

edit: strong> Je n'ai pas remarqué que cela est pour MySQL ma réponse était pour PostgreSQL, mais je pense que la technique est toujours valide si vous savez ajouter des numéros de ligne à la requête. P>

Solution 2: fort> C'est une autre technique que vous pourriez utiliser, sans qu'il soit nécessaire d'ajouter Row_Number de regroupement, qui est fondamentalement en ajoutant une sous-requête dans la condition de jointure pour choisir une seule rangée à partir de photos associées (je sais que je suis Sill en utilisant PostgreSQL, mais je crois Il serait toujours applicable dans MySQL, ou tout simplement négliger et utiliser uniquement la technique): p>

SELECT g.* FROM gallery g 
LEFT JOIN pictures p ON g.id = p.gallery_id AND p.id = (
    SELECT id FROM pictures WHERE gallery_id = g.id LIMIT 1
);


0 commentaires