Ne kadar bu görevi / SQL yapılmalıdır olabilir?

4 Cevap php

Benim indata eşleşen bir sonuç oluşturmak istiyorum bir veritabanı var.

Explanation of examples: "Indata" is a row with criteria for the filter in step #1, see below. "Results after filter #1" is the rows left after step #1 "Results after filter #2" is the rows left after step #2 "Print for indata 1" is the end result, presenting the contect of field OutData after the second filtering, along with the combined content of field "Warn"

Adım # 1. Sadece Indata eşleşen kayıtları tutmak Outdata tabloyu Filtre. Yıldız * bir şey eşleştirme. Her satır satır indata eşleşmesi gerekir. Örneklere bakın.

Step #1b. Indata Depl is not matched directly but checked to be in the range OutData Depl-DeplOffMin>Indata Depl

Adım # 2.. Yine Outdata tablosuna filtre sadece her Pos benzersiz satırları tutmak, çiftleri bulunduğunda düşük Uyuşmazlığı ile satırı seçin. Örneklere bakın.

Adım # 3. Eşsiz Pos ile Outdata Field tüm olası kombinasyonları oluşturun. ÖRGÜsündeki gibi: OutData İlk Sır = 10 + OutData İlk Sır = 20 + OutData İlk Sır = 30 + OutData örneklerde ilk = 30 Pos, bkz "Yazdır" çizgileri için.

Adım 4. Sıralama çıkış kombinasyonları üstüne düşük uyumsuzluğu var "Yazdır" satırları, yani. Örneklere bakın.

Eğer büyük bir SQL sorgusu olarak yapmak, veya PHP daha çalışma yaparken ile karıştırma vb geçici tablolar oluşturmak için denemek istiyorsunuz?

(Gerçek bir veritabanı belki 1000rows ve MySQL 30 alanlar olduğunu. Indata Ajax ve PHP sunucu kodu Yazdırma verilerini oluşturur ve geri gönderir aracılığıyla sunucuya gönderilir.)

"Outdata" table, example:

Pos   OutData     Warn  Mismatch    Producer    Depl        DeplOffMax        DeplOffMin  Axis        Connection
10    S                 0           S           *           *                 *                       *           *
20    24                0           S           24          *                 *           *           *
20    24          +-5   5           S           24          5                 -5          *           *
20    24          +-10  10          S           24          10                -10         *           *
20    48                0           S           48          *                 *           *           *
30    AA                0           S           *           *                 *           A           *
30    AB                0           S           *           *                 *           B           *
30    AC                0           S           *           *                 *           C           *
30    AA          B-AA  5           S           *           *                 *           B
40    C1                0           S           *           *                 *           *           C1
40    C1                1           S           *           *                 *           B           *
40    C1                2           S           24          10                -10         *           *
40    C2                0           S           *           *                 *           *           C2





Example 1:
Indat 1:                           S           24                                        A           C2

Result for indata 1 after filter #1:
10    S                 0           S           *           *                 *                       *           *
20    24                0           S           24          *                 *           *           *
20    24          +-5   5           S           24          5                 -5          *           *
20    24          +-10  10          S           24          10                -10         *           *
30    AA                0           S           *           *                 *           A           *
40    C1                2           S           24          10                -10         *           *
40    C2                0           S           *           *                 *           *           C2

Result for indata 1 after filter #2:
10    S                 0           S           *           *                 *                       *           *
20    24                0           S           24          *                 *           *           *
30    AA                0           S           *           *                 *           A           *
40    C1                2           S           24          10                -10         *           *
40    C2                0           S           *           *                 *           *           C2

Print for indata 1:
Mismatch 0:       S 24 AA C2  Warning -
Mismatch 2:       S 24 AA C1  Warning -



Example 2:
Indata 2:                           S           33                                        B           C2

Result for indata 2 after filter #1:
10    S                 0           S           *           *                 *                       *           *
20    24          +-10  10          S           24          10                -10         *           *
30    AB                0           S           *           *                 *           B           *
30    AA          B-AA  5           S           *           *                 *           B
40    C1                1           S           *           *                 *           B           *
40    C1                2           S           24          10                -10         *           *
40    C2                0           S           *           *                 *           *           C2

Result for indata 2 after filter #2:
10    S                 0           S           *           *                 *                       *           *
20    24          +-10  10          S           24          10                -10         *           *
30    AB                0           S           *           *                 *           B           *
30    AA          B-AA  5           S           *           *                 *           B
40    C1                1           S           *           *                 *           B           *
40    C2                0           S           *           *                 *           *           C2

Print for indata 2:
Mismatch 10:      S 24 AB C2  Warning: +-10
Mismatch 11:      S 24 AB C1  Warning: +-10
Mismatch 15:      S 24 AA C2  Warning: +-10 B-AA
Mismatch 16:      S 24 AA C1  Warning: +-10 B-AA





Example 3:
Indata 3:                           S           28                                        B           C1

Result for indata 3 after filter #1:
10    S                 0           S           *           *                 *                 *           *
20    24          +-5   5           S           24          5                 -5          *           *
20    24          +-10  10          S           24          10                -10         *           *
30    AB                0           S           *           *                 *           B           *
30    AA          B-AA  5           S           *           *                 *           B
40    C1                0           S           *           *                 *           *           C1
40    C1                1           S           *           *                 *           B           *
40    C1                2           S           24          10                -10         *           *

Result for indata 3 after filter #2:
10    S                 0           S           *           *                 *                 *           *
20    24          +-5   5           S           24          5                 -5          *           *
30    AB                0           S           *           *                 *           B           *
30    AA          B-AA  5           S           *           *                 *           B
40    C1                0           S           *           *                 *           *           C1

Print for indata 3:
Mismatch 5:       S 24 AB C1  Warning: +-5
Mismatch 10:      S 24 AA C1  Warning: +-5 B-AA

4 Cevap

Ben ne adım 3 aracı hiçbir fikrim yok, ama tüm diğer adımları SQL yapılabilir, ayrıca, muhtemelen SQL onun çok daha verimli yapılmalıdır.

Ben (bunu bilmek yararlı olurdu) bir MySQL veritabanı kullanarak konum senin etiketleri varsayalım.

Benim ilk thots çizgisinde somethnig olacaktır:

 SELECT outdata.Pos,
     outdata.OutData,
     outdata.Warn,
     MIN(outdata.Mismatch),    
     outdata.Producer,
     outdata.Depl,
     outdata.DeplOffMax,        
     outdata.DeplOffMin,
     outdata.Axis
     outdata.Connection
 FROM outdata, indata
 WHERE
   (//some nasty type juggling here
     outdata.depl='*'
     OR outdata.deploffmin='*'
     OR indata.depl='*'
     OR (
        outdata.depl<>'*'
        AND outdata.deploffmin<>'*'
        AND indata.depl<>'*'
        AND outdata.depl-outdata.deploffmin>indata.depl
     )
   )  
 AND ( outdata.outdata=indata.outdata
   OR outdata.outdata='*'
   OR indata.outdata='*' )
 AND ( outdata.connection=indata.connection
   OR outdata.connection = '*'
   OR indata.connection='*' )
 AND (outdata.axis=indata.axis
   OR outdata.axis='*' 
   OR indata.axis='*' )
 ....repeat for all the fields you want to match       
 GROUP BY outdata.Pos,
     outdata.OutData,
     outdata.Warn,    
     outdata.Producer,
     outdata.Depl,
     outdata.DeplOffMax,        
     outdata.DeplOffMin,
     outdata.Axis
     outdata.Connection
 ORDER BY 4 ASC;

Simples.

C.

İlk olarak, soru çok uzun.

İkincisi, kurallar (# 1, # 1b, # 2, # 3 ve # 4) kafa karıştırıcı ve açıklığa kavuşturulması gerekir.

Ancak, buna rağmen, bu benim tavsiyem.

If it's not obvious how to do it in SQL, don't.

Iki seçeneğiniz var (vs, "çiftleri bulunduğunda düşük Uyuşmazlığı ile satırı seçin", "yıldızı şey eşleştirme") sorgu için "kurallar" ile böyle bir şey için.

  1. Bu SQL uygulanabilir, böylece işlem adımları basitleştirme. Bu genellikle iyi bir şeydir. Geçerli ifadesi şaşkın ve takip etmek zor. Zaman zaman iyi geçirmiş olacaktır basitleştirilmesi geçirdi.

  2. Sıradan bir programlama dili kullanın. Değil "kuvvet" bunları yapmak, SQL yapmak zor şeyler ulaştığınızda. SQL veri almak ve PHP işlemek.

SQL - genellikle - yavaş. Eğer belleğe sığmaz veri geniş hacimli olması ve devam işlem güncellemeleri var zaman iyi kullanılır. 1000 satır ve 30 alanlar bellekten kolayca sığan veri önemsiz bir miktardır. Eğer (herhangi bir güncelleştirme devam ile) analiz etmek için veri toplu verilen ediyorsanız SQL pek yardımcı değil.

PHP kullanarak - - Çok yoğun bir web sitesi olarak size eşzamanlı kullanıcılar sürü sorunlar olabilir. Hangi durumda, bu yüzden Apache altında çalışan değil PHP dışarı olsun. Apache gibi zaman belleği bitene kadar, sadece PHP bunu.

Ben tam iş mantığı anlamıyorum, ama veri gibi küçük bir miktar için SQL'de uygulamak için çalışmakla ağrı geçiyor rahatsız olmaz. Daha hızlı sadece üzerinde tüm verileri çekerek ve filtreleri uygulamak için PHP kullanarak olması muhtemeldir.

Öğrendiğim bir şey. Hesaplanabilir bir şey veritabanına kaydedilir edilmemelidir