Bir veritabanındaki tüm tabloları bir alan toplanmasıyla

4 Cevap php

Ben adında bir MySQL veritabanı var "bookfeather." Bu 56 tablo içeriyor. Her tablo, aşağıdaki yapıya sahiptir:

id site votes_up votes_down

"Site" için değer bir kitap adı. "Votes_up" için değer, bir tam sayıdır. Bazen "site" için benzersiz bir değer birden çok tabloda görünür.

Tüm veritabanı her benzersiz bir değer "site" için, ben 56 tablolardaki "votes_up" özetlemek istiyorum. Sonra total "votes_up" göre sıralanmış "site" için en iyi 25 değerlerini yazdırmak istiyorum.

PHP bunu nasıl yapabilirim?

Teşekkür peşin,

John

4 Cevap

(: Önümüzdeki derece kötü SQL uyarısı) böyle bir şey yapabilirsiniz

select site, sum(votes_up) votes_up
from (
    select site, votes_up from table_1
    UNION
    select site, votes_up from table_2
    UNION
    ...
    UNION
    select site, votes_up from table_56
) group by site order by sum(votes_up) desc limit 25

Dav sordu Ama, veri have böyle olmak zorunda? Veri bu tür depolama çok daha verimli yollar vardır.

Edit: Sen sadece gelecekte fazla 56 tablo olmasını bekliyorum bir açıklamada sözü - Ben SQL ile bu tür ileriye gitmeden önce BİRLİĞİ kaç tablo yapabilirsiniz MySQL sınırları içine bakmak istiyorum.

Ian Clelland cevap BİRLİĞİ kısmı aşağıdaki gibi bir ifade kullanılarak oluşturulabilir. Tablo INFORMATION_SCHEMA.COLUMNS tüm tabloları almak için bir sütun Tablo_ismi vardır.

select * from information_schema.columns 
where table_schema not like 'informat%'
and column_name like 'VOTES_UP'

TÜM yerine BİRLİĞİ BİRLİĞİ ile tüm iç SEÇ katılın. BİRLİĞİ (Oracle) örtülü bir FARKLı yapıyor.

Temel fikir, PHP (bir SQL SHOW TABLES deyimi veya benzeri kullanarak) tüm masaları üzerinde yineleme sonra her tablo için, satırlar üzerinde yineleme olacaktır (SELECT site,votes_up FROM $table). Sonra, her satır için, tuş gibi siteler ile yapı ve değerler olarak oylama konum bir dizi karşı sitesini kontrol edin. Site dizide zaten varsa, uygun oylarını artırmak; aksi takdirde, bunu ekleyin.

Belli belirsiz PHP gibi pseudocode:

// Build an empty array for use later
$votes_array = empty_array();

// Get all the tables and iterate over them
$tables = query("SHOW TABLES");
for($table in $tables) {
    $rows = query("SELECT site,votes_up FROM $table");

    // Iterate over the rows in each table
    for($row in $rows) {
          $site = $row['site'];
          $votes = $row['votes_up'];

         // If the site is already in the array, increment votes; otherwise, add it
         if(exists_in_array($site, $votes_array)) {
             $votes_array[$site] += $votes;
         } else {
             insert_into_array($site => $votes);
         }
    }
}

// Get the sites and votes as lists, and print out the top 25
$sorted_sites = array_keys($votes_array);
$sorted_votes = array_values($votes_array);
for($i = 0; $i < 25; $i++) {
    print "Site " . $sorted_sites[$i] . " has " . $sorted_votes[$i] . " votes";
}

"Kullanıcıların veritabanı tabloları eklemek için izin verir." - Ben tüm kullanıcılar hayırsever ve güvenilir ve yetenekli umuyoruz. Eğer insanlar bırakarak veya kesilmesi tablolar, kodunuzu kırmak yanlış yeni tablolar oluşturma, ya da bunun gibi diğer şeyler hakkında endişe mi? Kullanıcıların doğru veritabanına oturum ve şema değiştirebilirsiniz zaman güvenlik Ne tür var?

İşte tutorial ilişkisel veritabanı normalleştirme bulunuyor. Belki yardımcı olacak.

Sadece durumda böyle, burada istediğini yapabileceği bir tek tablo var baktım ne olabileceğini bulmak istiyor sonra gelir bir başkası:

create database bookfeather;
create user bookfeather identified by 'bookfeather';
grant all on bookfeather.* to 'bookfeather'@'%';

use bookfeather;

create table if not exists book
(
    id int not null auto_increment,
    title varchar(255) not null default '',
    upvotes integer not null default 0,
    downvotes integer not null default 0,
    primary key(id),
    unique(title)
);

Bir UPDATE yukarı veya aşağı bir başlık oy istiyorum:

update book set upvotes = upvotes + 1 where id = ?

Yeni bir kitap ekleme, başka bir satır eklemek kadar kolaydır:

insert into book(title) values('grails in action')

Ben kesinlikle yeniden gözden teşvik ediyorum.