Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Abfragen für API

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Zitat von Dsdxb Beitrag anzeigen
    Ja, daran hab ich gedacht, aber ich krieg die Kombination aus count und der $amount varible nicht hin. Durch das JOIN verdoppelt der (oder verdreifacht oder was auch immer) die Datenbank und dann stimmt zum Beispiel das Count nicht mehr. Und selbst wenn ich das hinkriege weiss ich nicht wie ich das mit der varibale hinkriege. Und ja du hast Recht; Das alles ist ein neues Konzept fuer mich deswegen frag ich ja
    Mit DIESER Ausgangslage willst Du eine Firma gründen und eine App entwickeln? Ernsthaft?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #17
      Sorry. Aber das ist nicht ganz das was ich geschrieben habe. Kurzfassung: wir haben Entwickler, die raffen aber diesen Punkt nicht, deswegen sende ich ihnen die Queries teilweise zu. Ja, es ist scheiße. Ja, ich bin nicht glücklich damit und ja, wenn ich es vorher gemerkt hätte, hätte ich sie nicht genommen. Ich konnte aber nicht ahnen, dass solche eher einfacheren Abfragen professionelle Entwickler überfordern. Ansonsten siehe oben, hätten wir andere genommen. Und nein finanziell können wir nicht zusätzlich noch andere engagieren, sonst hätten wir auch das schon gemacht.

      Und ich denke nicht, dass man als jemand, der eine Idee hat, diese zu 100 Prozent selbst umsetzen muss. Dafür holt man sich dann ja Hilfe. Dass die in unserem Falle leider nicht so toll war ist mist, aber ich muss jetzt damit leben und das beste draus machen
      ​​​​​​

      Kommentar


      • #18
        die verschiedenen Arten von JOIN's sind super gut auf tausenden Webseiten erklärt, lernen müßt ihr das selber. Das sind absolute Basics. Hint: nehmt eine gescheite DB, PostgreSQL z.B. MySQL ist aufgrund seiner vielen Bugs für Anfänger eher ungeeiget. Und für praktische Anwendungen später auch.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #19
          Danke, es ist mir schon geholfen, wenn du sagst, dass es möglich ist und dass ich nach Join suchen muss. Da kann ich mich durchkämpfen.

          Könntest du mir noch nen Hinweis geben, wie ich das mit der variable hinkriege oder ist das der falsche Wert? Ich hab probiert coint(id) as amount und später dann geld > amount (als beispiel), aber dann sagt er unknown value amount

          Kommentar


          • #20
            zu wenig Kontext, sieht aber so aus, als ob Du im selben Level, in dem Du einen Alias definiert hast, auf diesen zugreifen willst. Das geht nicht in SQL. Demo:

            Code:
            edb=*> select 1 + 5 as x, x + 1 as y from dual;
            FEHLER:  Spalte »x« existiert nicht
            LINE 1: select 1 + 5 as x, x + 1 as y from dual;
                                       ^
            edb=*> select 1 + 5 as x, (1+5) + 1 as y from dual;
             x | y
            ---+---
             6 | 7
            (1 row)
            
            edb=*>
            Alternative Lösungen wären Subselects oder CTE's.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #21
              Ok, ich hab mich da mal versucht einzulesen, aber ich denke, das was ich letztendlich benoetige (ich dachte ich kann aus den 2 gejointen Abfragen auch einfach 3 machen) ist so extrem weit ueber meinem Verstaendnis, dass ich es leider so nicht loesen kann. Dann hoff ich einfach, dass die Entwickler das soweit hinkriegen. Danke trotzdem fuer euren Versuch.

              Kommentar


              • #22
                Hat mir natürlich doch keine Ruhe gelassen... Ich hab mal ein Fiddle erstellt bei dem klar wird was ich habe/benötige.
                http://sqlfiddle.com/#!9/bc9509/3

                ich moechte quasi, dass anhand des amounts in t2 geschaut wird was die entsprechende Anzahl kostet. In diesem konkreten Fall hätte ich gerne folgende Ausgabe
                A 4 199
                B 2 200
                C 1 300

                krieg ich das ueberhaupt hin? Egal was ich ueberlege komme ich irgendwann zu dem Punkt wo ich nicht mehr weiterkomme. Mit join hab ich es probiert, aber da krieg ich keine eindeutige verkettung hin und die tabellen werden quasi multipliziert. Hab an with gedacht, aber hab einfach generell nicht genug Ahnung von.Leider. Könnte mir evtl jemand einen konkreteren Hinweis geben? Vielen Dank.

                Kommentar


                • #23
                  krieg ich das ueberhaupt hin? Egal was ich ueberlege komme ich irgendwann zu dem Punkt wo ich nicht mehr weiterkomme.
                  dein beispiel hinkt oinsofern als dass alle infos in einem tabel sind, un der zweite völlig unnötig .
                  leider ist die db nicht normalisiert.

                  ob du das hinkriegst ?
                  schon mal "select data from two tables" in eine suchmaschoine eingegeben ?
                  wenn es mit join zu hektig ist, nutze eben nur select .

                  https://www.informit.com/articles/ar...30875&seqNum=5

                  Kommentar


                  • #24
                    Wahrscheinlich steh ich auf dem Schlauch, aber wieso ist meine 2. Tabelle überflüssig?

                    Anhand der Anzahl an items die ich aus Tabelle 1 ermittel möchte ich nachschauen wie teuer das jeweilige item ist (als beispiel). Aktuell habe ich eine Abfrage die aussieht wie im fiddle und danach frag ich die jeweiligen items einzeln ab. Sprich wieviel kostet item A insgesamt wenn ich 4 davon kaufe usw.

                    Select data from 2 tables komm ich zu dem Problem, dass ich nicht weiß wie ich diese art "variable" da reinkriege. Ich will ja nicht allle Preise haben sondern eben nur den jeweils zur Anzahl passenden


                    Edit: ich glaube ich versteh was du meinst mit überflüssig. Ich hab mein fiddle angepasst es sollte so etwas klarer werden.
                    http://sqlfiddle.com/#!9/bc9509/13

                    Gibt es eine Möglichkeit diese ganzen einzelnen Anfragen so zu bündeln, dass ich nur eine habe und als ergebnis quasi eine Tabelle bekomme:
                    A 4 199
                    B 2 200
                    C 1 300

                    Und zwar auch, wenn ich nicht nur 3 items habe sondern 20 oder 25.

                    Kommentar


                    • #25
                      in table T1 hast du vier mal A i table t1 aber nur drei mal A mit verchiedenen preisen. aber ingsamt sechs stück ?

                      gut A und T1 sind keine besonderen bezeichner, jedoch verstehe ich das desing nicht.

                      wieso soll C 1 300 rauskomenn und nicht C 2 350 oder C 1 300 C 1 400 ?
                      bei max sollte ja 400 rauskommen ich weiss, aber welcehn mehrwert bietet dir das ?

                      die zahl dfer produkte ist weniger entscheident, onlinedhops schaffen auch locker 25 oder 30 ^^

                      Kommentar


                      • #26
                        Ok ich versuche es zu erklären. Das ganze ist natürlich ein stark vereinfachtes Problem und ich sehe es ein, dass sich die Anwendung hieraus nicht erschließt.

                        Ich versuche es mal zu erklären.
                        In t1 stehen verschiedene items (warenkorb, möbel im zimmer wie auch immer. Wir tun mal so, dass es ein Warenkorb ist).

                        In t2 stehen quasi Preise für verschiedene Waren und Mengen. Zum Beispiel kaufe ich ein A kostet es 100, kaufe ich 2 A kosten sie 150 und 3 und mehr A (also auch 10) kosten fix 199 (ich weiß das gibt kein sinn, aber es soll ja nur ein Beispiel sein).

                        Ich möchte jetzt anhand der Anzahl der Items in t1 wissen wieviel bezahlt werden muss. Also "ok es sind insgesamt 4 A in t1, das heißt es kostet 199. Es sind 2 B in t1 also kostet es 200 usw.

                        Das DB Design wäre für so eine Anwendung natürlich bushit, das weiß ich auch, aber für das Beispiel soll das jetzt mal egal sein.

                        Bitte versteht mich nicht falsch: Ich möchte keine fertige Lösung haben, aber im Moment sehe ich den Wald vor lauter Bäumen nicht. Und ich bin ganz klar Anfänger. Das weiß ich auch, aber ich würde gerne dazu lernen. Bisher hab ich oft gehört "du hast keine Ahnung". Stimmt auch. Hab ich nie bezweifelt. Dennoch würde mich eben interessieren ob ich so eine Abfrage ohne schleifen usw hinkriege oder ob es evtl vielleicht auch gar nicht möglich ist.
                        ​​​​​​
                        Es wurden CTEs und subselects vorgeschlagen. Da hab ich zwar viel dazu gelernt, aber irgendwie komm ich nicht drauf.

                        Ist es wirklich so kompliziert wie es aussieht oder seh ich die naheliegende Lösung einfach nicht mehr?
                        ​​​​

                        Kommentar


                        • #27
                          Kryptische Namen wie T1, usw. tragen nicht unbedingt zur Verständlichkeit eines Beispiels bei. Im Gegenteil, das macht es nur unnötig komplizierter und abstrakter. Deswegen schaue ich mir z.B. sowas erst gar nicht an. Wozu sich den Kopf mit sowas zermartern?

                          Kommentar


                          • #28
                            Mit Deinen Daten...

                            Code:
                            edb=*# \d warenkorb
                                          Table "public.warenkorb"
                             Column  |  Type   | Collation | Nullable | Default
                            ---------+---------+-----------+----------+---------
                             id      | integer |           |          |
                             artikel | text    |           |          |
                            
                            edb=*# \d preise
                                            Table "public.preise"
                             Column  |   Type    | Collation | Nullable | Default
                            ---------+-----------+-----------+----------+---------
                             artikel | text      |           |          |
                             menge   | int4range |           |          |
                             preis   | numeric   |           |          |
                            Indexes:
                                "preise_artikel_menge_excl" EXCLUDE USING gist (artikel WITH =, menge WITH &&)
                            
                            edb=*#
                            
                            
                            
                            edb=*# select * from warenkorb ;
                             id | artikel
                            ----+---------
                              1 | a
                              2 | a
                              3 | a
                              4 | b
                              5 | b
                              6 | c
                              7 | a
                            (7 rows)
                            
                            edb=*# select * from preise;
                             artikel | menge | preis
                            ---------+-------+-------
                             a       | [1,2) |   100
                             a       | [2,3) |   150
                             a       | [3,)  |   199
                             b       | [1,)  |   200
                             c       | [1,2) |   300
                             c       | [2,)  |   400
                             d       | [1,)  |    66
                            (7 rows)
                            
                            edb=*# with wk as (select artikel, count(1) from warenkorb group by artikel) select wk.*, p.menge, p.preis, wk.count * p.preis as preis from wk left join preise p on wk.count::int <@ p.menge and wk.artikel = p.artikel;
                             artikel | count | menge | preis | preis
                            ---------+-------+-------+-------+-------
                             a       |     4 | [3,)  |   199 |   796
                             b       |     2 | [1,)  |   200 |   400
                             c       |     1 | [1,2) |   300 |   300
                            (3 rows)
                            Spalte 'menge' in der Preise-Tabelle ist ein INT4RANGE, hier kann ich also sagen, z.B., Artikel 'a' kosten zwischen 2 und 3 150, bei 3 oder mehr 199. Der Rest ist simpel, oder?
                            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                            Kommentar


                            • #29
                              Ok, das kann ich gerne aendern. Sorry ich dachte es ist uebersichtlicher so. Ich hab es geandert.:
                              http://sqlfiddle.com/#!9/748ba3/3

                              Ich bin aktuell auch an was dran. Sieht zwar nicht schoen aus, aber es geht in die richtige Richtung:
                              PHP-Code:
                              WITH v_table AS
                              (
                              select itemcount(item) as v_amount from fruit_basket group by item)

                              SELECT price_list.itemv_table.v_amountprice_list.amountprice_list.total_price FROM v_table
                              JOIN price_list ON price_list
                              .item price_list.item
                              WHERE price_list
                              .item IN (v_table.item) AND price_list.amount <= v_table.v_amount
                              als fiddle wollte ich es machen da gibts aber nur eine Fehlermeldung, auf Heidi gehts aber.
                              Jetzt muss ich nur noch irgendwie die ueberfluessigen Reihen filtern. Mal schauen ob ich das noch hinkriege


                              edit: hab den letzten Post noch nicht gesehen. Werde mir den jetzt direkt mal anschauen

                              Kommentar


                              • #30
                                Danke akretschmer fuer deine Hilfe. Leider funktioniert das Ganze in MYSQL nicht.

                                Ich habe jetzt folgendes gemacht:
                                PHP-Code:
                                WITH v_table AS
                                (
                                select itemcount(item) as v_amount from fruit_basket group by item)

                                SELECT price_list.itemv_table.v_amountMAX(price_list.total_price) AS total_price FROM v_table
                                JOIN price_list ON price_list
                                .item price_list.item
                                WHERE price_list
                                .item IN (v_table.item) AND price_list.amount <= v_table.v_amount GROUP BY v_table.item
                                Das funktioniert jetzt soweit.

                                Kommentar

                                Lädt...
                                X