Order by Count

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo!

Ich möchte in meiner Datenbank absteigend eines Zählwertes sortieren. Leider funktioniert das nicht richtig. Hier mal mein Code:

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: iso-8859-15 -*- 

import os 
import sys 
import sqlite3 

FILENAME = "hits.sdb3" 
contig_file = open("all_hits.txt", 'r')

def parse_cseq(fh):
    for line in fh:
        line = line.replace('\n', '')
        yield line.split('\t')

def create_db_structure(conn): 
    sql = """CREATE TABLE contigs 
                          (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
                          code TEXT,
                           name TEXT,
                           seq TEXT,
                           start NUM,
                           end NUM,
                           sub_start NUM,
                           sub_end NUM)
                   """
    conn.execute(sql) 
    conn.commit() 
    
    
    conn.executemany("""INSERT INTO contigs
                               (code, name, seq, start, end, sub_start, sub_end)
                               VALUES (?, ?, ?, ? ,? , ?, ?)
                           """, parse_cseq(contig_file))
    
    conn.commit()

    
def select_all_name(conn, sbj): 
    sql = """SELECT COUNT(c.code) AS counting, c.name
             FROM contigs AS c
             WHERE c.name  = ? 
             AND c.code='ALL'
             ORDER BY counting DESC
             """
    cur = conn.cursor() 
    cur.execute(sql, (sbj,)) 
    return cur
    
def main(): 
    if os.path.isfile(FILENAME): 
        os.remove(FILENAME) 
    conn = sqlite3.connect(FILENAME) 
    create_db_structure(conn)
    all = ['Contig5535', 'Contig5534']

    for a in all:
        a = a.replace('\n', '')
        cursor_all = select_all_name(conn, a)
        for line in cursor_all:
            print line

    conn.close()


if __name__ == "__main__": 
    main()
    
all_hits.txt hat folgenden Inhalt:

ALL Contig5535 TAAGCACAACATGGAGAACAG 485 506 466 486
EFF Contig5535 TAAGCACAACATGGAGAACAG 485 506 466 486
ALL Contig5534 TAAGCACAACATGGAGAACAG 485 506 751 771
EFF Contig5534 TAAGCACAACATGGAGAACAG 485 506 751 771
ALL Contig5534 ACCCGATGCCAAAATCCAAGA 560 581 826 846
ALL Contig5534 TGGTTCTGATGAACAAACTTC 8 29 274 294
ALL Contig5535 AGCTAAGCACAACATGGAGAA 482 503 463 483
ALL Contig5534 AGCTAAGCACAACATGGAGAA 482 503 748 768
ALL Contig5534 GAAAATGTAATCCTGCCAAGA 261 282 527 547
ALL Contig5534 CAGCCCTCCTTAATTTGTCAC 592 613 858 878
ALL Contig5534 GCGATCTGGTGCTGTAAAGCC 764 785 1030 1050
ALL Contig5534 TACTTTGTTCAGTCTCTCAAT 716 737 982 1002
ALL Contig5534 CAGCAGCTACTTTGTTCAGTC 709 730 975 995
ALL Contig5534 TTGCTGACCGTGGGCTTTCTA 220 241 486 506
ALL Contig5534 ATTTGGGAAGTGATTCCATAG 424 445 690 710
EFF Contig5534 ATTTGGGAAGTGATTCCATAG 424 445 690 710
ALL Contig5534 AAAGGGAAAATGTAATCCTGC 256 277 522 542
ALL Contig5535 TACGAGTTCCAGGTGATAGGA 169 190 150 170
ALL Contig5534 TACGAGTTCCAGGTGATAGGA 169 190 435 455
ALL Contig5535 GAAACAGGGAACCCTGAAGCT 678 699 659 679
ALL Contig5534 GAAACAGGGAACCCTGAAGCT 678 699 944 964
ALL Contig5534 ATAAACTTGCTGGTTGGCCTT 531 552 797 817
ALL Contig5534 GATTCCCGAGAATAATTTCGT 337 358 603 623

Was mache ich falsch?
Liebe Grüsse
Stefanie
Zuletzt geändert von ete am Mittwoch 27. Mai 2009, 10:33, insgesamt 1-mal geändert.
http://www.snowflake-sl.info/index.html
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ete hat geschrieben: Ich möchte in meiner Datenbank absteigend eines Zählwertes sortieren. Leider funktioniert das nicht richtig.
Was ist denn das Ergebnis und was ist daran "nicht richtig"?
BlackJack

@ete: Mach Dir mal klar was in der Datenbank abläuft und was in Deinem Programm. Du hast da zwei *unabhängige* Anfragen an die Datenbank, die jeweils *eine* Ergebniszeile liefern. Diese Zeile zu sortieren, ist ziemlich sinnfrei. Die DB müsste schon in die Zukunft sehen können, um zu wissen was als nächste Abfrage kommt, um dann bei der ersten Abfrage ein Ergebnis zu einer Frage zu liefern, die noch gar nicht gestellt wurde. ;-)

Edit: Mit einer Anfage könnte man alle Einträge mit `code="ALL"` und Zählen der Vorkommen so ermitteln:

Code: Alles auswählen

sqlite> SELECT COUNT(c.code) AS counting, c.name
   ...> FROM contigs AS c
   ...> WHERE c.code = 'ALL'
   ...> GROUP BY c.name
   ...> ORDER BY counting DESC
   ...> ;
16|Contig5534
4|Contig5535
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Ah, danke für die Erklärung, war ein Denkfehler.

@Hyperion
Ausgabe war:
4|Contig5535
16|Contig5534

Ich brauchte aber:
16|Contig5534
4|Contig5535

Liebe Grüsse
Stefanie
http://www.snowflake-sl.info/index.html
Antworten