9
votes

SQL retourne des rangées dans un ordre "rond-robin"

J'ai une bande d'URL stockées dans une table en attente d'être grattée par un script. Cependant, beaucoup de ces URL sont du même site. Je voudrais renvoyer ces URL dans une commande "Site-amical" (c'est-à-dire essayer d'éviter deux URL du même site d'affilée), donc je ne serai donc pas bloquée accidentellement en faisant trop de demandes HTTP en peu de temps. .

La mise en page de la base de données est quelque chose comme ceci: xxx

résultat: xxx

J'ai pensé à quelque chose comme " Commander par site <> @Last_Site Desc " Mais je n'ai aucune idée de savoir comment écrire quelque chose comme ça.


0 commentaires

5 Réponses :


3
votes

Je pense que vous surchargez cela. Pourquoi pas simplement utiliser

commander par NewID ()


3 commentaires

Joli! Joliment simpliste.


Est-ce similaire à aléatoire ()? Si c'est le cas, ce n'est pas assez bon. Il existe quelques sites qui représentent 10 à 30% de la table.


@HHAAMU: Je pense que vous sous-estimez la puissance du hasard:



5
votes

Voir cet article sur mon blog pour des explications plus détaillées sur la façon dont cela fonctionne:


5 commentaires

La dernière requête vraiment doit être vérifiée pour une efficacité si votre table est grande.


Merci, ça marche parfaitement! On dirait que Voodoo pour moi, mais je vais le comprendre un jour.


J'utilise toujours 8.3, mais la table n'est que 150 rangées jusqu'à présent.


@HHAAMU: Notez que la durée de requête pour la dernière requête augmentera de manière exponentielle. Je serais testé sur le nombre maximum d'enregistrements que vous envisagez d'atteindre.


@Quassnoi: fera. Il y a beaucoup de doute qu'il y aura 1000 rangées. Et la requête ne sera pas courue tout cela souvent (une fois par jour ou plus rarement).



2
votes

Vous demandez de rond-robin, mais je pense qu'un simple xxx

fera le tour. Il devrait fonctionner même si les URL du même site sont regroupées dans DB.


0 commentaires

0
votes

Si les URL ne changent pas très souvent, vous pouvez proposer un travail quelque peu compliqué que vous pourriez courir périodiquement (nocturne?) qui affecterait des entiers à chaque enregistrement basé sur les différents sites présents.

Que Vous pouvez faire est d'écrire une routine qui analyse du domaine à partir d'une URL (vous devriez être capable de trouver un extrait qui le fait presque n'importe où). P>

Ensuite, vous créez une table temporaire contenant chaque domaine unique. , plus un nombre. p>

Puis, pour chaque enregistrement de votre table d'URL, vous recherchez le domaine de votre table Temp, affectez-vous l'enregistrement du nombre de numéros et ajoutez un grand nombre à ce numéro de la table TEMP. . P>

Puis pour le reste de la journée, trier par le numéro. p>


Voici un exemple avec les cinq enregistrements que vous avez utilisés dans votre question: p>

URL: p>


0 commentaires

0
votes

Il y a une solution beaucoup plus simple et plus rapide ...

  • Ajouter une colonne de type Sort_Order Texte
  • Ajoutez un déclencheur d'insertion qui définit Sort_order sur MD5 (URL)
  • Index sur Sort_order
  • saisissez les rangées dans (Sort_Order, clé primaire) Commande

    -> C'est très rapide et indexé -> Les lignes viendront dans un ordre reproductible et aléatoire


0 commentaires