php
  • mysql
  • 2009-08-20 3 views 0 likes 
    0

    Le code ci-dessous renvoie les 25 tables les plus récemment créées dans une base de données MySQL.Récupération des 25 premières tables (définies par des valeurs de zone)

    $index = mysql_query("select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='bookfeather' order by CREATE_TIME desc limit 25"); 
    

    Chaque table a le format suivant:

    id INT(11) NOT NULL auto_increment, site VARCHAR(350) NOT NULL, votes_up BIGINT(9) NOT NULL, votes_down BIGINT(9) NOT NULL, PRIMARY KEY(id), UNIQUE (site) 
    

    Je voudrais changer le code pour afficher:

    1. Top 25 tables en fonction du nombre de différentes entrées pour « site "

    2. Top 25 des tables basées sur la somme de" votes_up "

    Comment est-ce que je peux faire ceci?

    Merci à l'avance,

    John

    +0

    Ce serait trivial avec une seule table. http://stackoverflow.com/questions/1297138/excluding-a-variable-when-its-value-is-blank/1297159#1297159 – deceze

    +1

    Ce que je veux dire par ce qui précède est que vous n'êtes pas intéressé par les tables, vous ' Je suis intéressé par les catégories de livres (j'imagine que c'est toujours à propos de ce sujet). Vous pouvez parfaitement réaliser vos catégories de livres avec un nombre fixe de tables, et c'est pour cela que MySQL est optimisé. Vous pouvez sûrement travailler avec plusieurs tables dynamiques, mais cela rend la tâche beaucoup plus difficile, car c'est un peu "méta-SQL". – deceze

    +1

    Oui, la catégorie d'un livre doit être une donnée, pas une métadonnée. –

    Répondre

    0

    1. Les 25 tables en fonction du nombre de différentes entrées pour "site"

    IIUC, "site" est unique, donc vous devriez être capable de:

    select 
        TABLE_NAME, 
        ifnull(TABLE_ROWS, 0) as SITES 
    from INFORMATION_SCHEMA.TABLES 
        where TABLE_SCHEMA='bookfeather' 
    order by SITES desc limit 25 
    

    Mais en remplaçant TABLE_ROWS par no. des enregistrements de SITE uniques avec un clin d'œil et un clin d'œil triche - mieux à redessiner. :)

    2. Les 25 tables sur la base de la somme « votes_up »

    Si vous ne pouvez pas, pour une raison quelconque, suivez les excellents conseils pour redessiner, vous aurez à itérer programatically sur chaque table. Dans votre code vous pourriez boucle sur SHOW TABLES, accumuler le résultat de

    select 'tblName', ifnull(sum(VOTES_UP), 0) as UPVOTES from tblName 
    

    tri sur le deuxième champ de vos lignes accumulées et la taille au sommet 25.

    Une variante de cela implique un tableau récapitulatif qui maintient trace des tables et sum() 'd UPVOTES, peut-être réécrites périodiquement par cron, mises à jour à la volée par des déclencheurs par table, ou présentées dans un VIEW (re CREATE d pour chaque nouvelle table) qui est un UNION de toutes les requêtes constituantes.

    Mais ne faites rien de tout cela. :) Passer à une conception de table unique (en demandant peut-être à votre moteur de stockage de partitionner, si c'est un problème).

    Questions connexes