-1
votes

Sélectionnez dans l'endroit où la clause comme

J'ai la requête SQL suivante:

SELECT * FROM `test1`

startswith
==========
aaa 
bbb 
ccc 

SELECT * FROM `test2`

text
====
aaa3k123k12312p03edwqeq 
aaa12313fwefrwerw   
aaafwre3we4232  
bbb123123rwqe12e1   


3 commentaires

Simplement supprimer l'ordre et limiter par la sous-requête?


@jarlh, si je fais cela, je reçois une erreur "SubQuery retourne plus d'une ligne".


Bien sûr ... faire une jointure à la place!


4 Réponses :


0
votes

Déplacez la sous-requête et Joindre CODE>:

SELECT text
FROM `test2`
JOIN (select startswith from test1 ORDER BY RAND() LIMIT 1) t1
    ON text LIKE concat(startswith,"%")


3 commentaires

Cela reviendra simplement toutes les lignes de Test2 qui commencent par n'importe quel du démarrage dans Test1. Je veux choisir un démarrage au hasard de Test1 Table.


Cela me donne l'erreur: "Chaque table dérivée doit avoir son propre alias". Voir: dbfiddle.uk/...


Je vois que certains produits veulent cela, d'autres non. Va éditer.



-1
votes

Votre code semble être comme celui-ci Sélectionnez * à partir du texte Test2where comme ===========% sans citations. Si vous mettez des données temporaires sur votre requête, cela obtiendrait-il toujours les résultats? Quelque chose comme xxx

et cette xxx

pour compléter votre code xxx


1 commentaires

Cela ne produira pas les résultats que j'ai mentionnés dans la question. Voir: dbfiddle.uk/...



0
votes

Utiliser le sous-sélection dans Rejoindre comme celui-ci

select t2.* from test2 as t2 join (SELECT RAND() as rand, startswith from test1 ORDER BY rand LIMIT 1) as t1 where t2.txt like CONCAT(t1.startswith,"%");


0 commentaires

0
votes

La raison pour laquelle votre code ne vous donne pas les résultats que vous attendez (par exemple, avec vos données d'échantillon, il renvoie parfois des valeurs commençant par AAA et BBB ou Vous ne pouvez pas obtenir toutes les valeurs commençant par aaa ) est que le condition est évalué pour chaque ligne de test2. Cela signifie que pour chaque ligne de test2, une valeur nouvelle valeur aléatoire et aléatoire est comparée à celle-ci, cela peut conduire (potentiellement) à correspondre à toutes les lignes ou aucune, même si toutes les valeurs de test1 sont le début d'une valeur dans test2 .

Le moyen de créer une table dérivée de votre sous-requête - de sorte qu'elle ne soit évaluée que une fois - et ensuite rejoindre que vers test2 à l'aide de la comparaison comme que vous utilisez: xxx

Démo sur dbfiddle

Notez que si startwith est "CCC", vous n'obtiendrez aucun résultat dans la sortie de vos données d'échantillon.


0 commentaires