Announcement

Collapse
No announcement yet.

Tabellenübergreifende Suche

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tabellenübergreifende Suche

    ich habe eine Frage:

    ich habe im Startfenster meiner Testhomepage gleich die Angebote stehen
    und mit einem Klick bekomme ich die detaillierten Angaben. Die Abfrage nach den detaillierten hat aber den Nachteil, das sie Sonderangebotspreise nicht berücksichtigt und immer noch die Originalpreise (die will ich behalten, falls man das Sonderangebot temporär beschränkt)..

    Wie schaffe ich das, das die Suche auch gleich prüft ob das Buch im Angebot ist?

    Für Verbesserungsvorschläge bin ich immer zu haben..

    Danke
    Thomas

    Select's:
    Angebote abfragen:
    Code:
    SELECT b.title AS Titel,b.isbn13 AS isbn13, a.surname AS Vorname, a.given_name AS Nachname, b.price AS "alt",b.imagepath AS path,
    o.price AS "neu" 
    FROM offer AS o, book AS b
    JOIN author_book AS ab ON b.isbn13=ab.book_id
    JOIN author AS a ON ab.author_id=a.id
    WHERE o.book_id=b.isbn13;
    Detaillierte Daten von einem Buch abrufen
    Code:
    SELECT b.title, b.content, b.cover, b.isbn10, b.isbn13, b.price, b.publication, b.imagepath, b.pages, a.surname, a.given_name, p.name, l.language, s.stock
    FROM publisher AS p, stock AS s,language AS l, book AS b
    JOIN author_book AS ab ON b.isbn13=ab.book_id
    JOIN author AS a ON ab.author_id=a.id
    WHERE p.id=b.publisher AND b.isbn13='.$id.' AND l.id= b.language AND s.book_id=b.isbn13;
    $id ist die übergebene Isbn13-Nummer


    meine Tabellen:
    #Buch#
    CREATE TABLE book(
    title VARCHAR(64) NOT NULL DEFAULT '',
    content LONGTEXT,
    cover ENUM('Hardcover','Softcover'),
    publisher INT,
    language INT UNSIGNED,
    isbn10 VARCHAR(10),
    isbn13 VARCHAR(13) NOT NULL PRIMARY KEY,
    price DECIMAL(7,2),
    publication DATE,
    pages INT UNSIGNED,
    imagepath VARCHAR(128)
    ) ENGINE=INNODB;

    #Autor#
    CREATE TABLE author(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    given_name VARCHAR(30) NOT NULL DEFAULT '',
    surname VARCHAR(30) NOT NULL DEFAULT ''
    ) ENGINE=INNODB;

    #Angebote#
    CREATE TABLE offer(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    book_id VARCHAR(13) NOT NULL,
    INDEX(book_id),
    FOREIGN KEY(book_id) REFERENCES book(isbn13),
    price DECIMAL(10,2)
    ) ENGINE=INNODB;


    #author mit books verknüpfen#
    CREATE TABLE author_book(
    author_id INT UNSIGNED NOT NULL,
    book_id VARCHAR(13) NOT NULL,
    INDEX(author_id),
    FOREIGN KEY(author_id) REFERENCES author(id),
    INDEX(book_id),
    FOREIGN KEY(book_id) REFERENCES book(isbn13)
    )ENGINE=INNODB;

    #Verlag#
    CREATE TABLE publisher(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL DEFAULT ''
    ) ENGINE=INNODB;

    #Sprache#
    CREATE TABLE language(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    language VARCHAR(30) NOT NULL DEFAULT 'Deutsch'
    ) ENGINE=INNODB;

    #Lager#
    CREATE TABLE stock(
    book_id VARCHAR(13),
    INDEX(book_id),
    FOREIGN KEY(book_id) REFERENCES book(isbn13),
    stock INT UNSIGNED
    ) ENGINE=INNODB;

  • #2
    Hallo,
    Originally posted by Enigma228 View Post
    ...Wie schaffe ich das, das die Suche auch gleich prüft ob das Buch im Angebot ist?
    Mit LEFT JOIN die Angebotstabelle einjoinen und mittels CASE, bzw. IF() den Preis ermitteln.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hi..

      leider geht mein Wissen nicht über normale Select From Where und den Join hinaus..
      und leider ist im Handbuch von Mysql die Case Anweisung nicht im Zusammenhang mit einer "normalen" Select From Where Anweisung verbunden..
      daher würde ich dich bitten mir vielleicht ein kleines Beispiel zu schreiben, damit ich sehen kann wo man die Case/IF -Anweisung einsetzt..

      Vielen Dank im Voraus
      Thomas

      Comment


      • #4
        Hallo,

        ein simples Beispiel, das die ISBN und den "aktuellen" Preis selektiert:
        [highlight=sql]
        select isbn13, ifnull(o.price, b.price) as current_price
        from book b
        left join offer o on o.book_id = b.isbn13
        [/highlight]

        Der CASE-Operator wird im MySQL-Handbuch unter Control Flow Functions geführt.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Vielen Dank

          ich probiere es mal!!

          Danke
          Thomas

          PS: habe es dank deiner Hilfe hinbekommen..

          Erstmal habe ich mir eine View erstellt in der ich alle Bücher habe..
          Code:
          CREATE VIEW allbooks AS
          SELECT b.title, b.content, b.cover, b.isbn10, b.isbn13, b.price, b.publication, b.imagepath, b.pages, a.surname, a.given_name, p.name, l.language, s.stock
          FROM publisher AS p, stock AS s,language AS l, book AS b
          JOIN author_book AS ab ON b.isbn13=ab.book_id
          JOIN author AS a ON ab.author_id=a.id
          WHERE p.id=b.publisher AND l.id= b.language AND s.book_id=b.isbn13;
          und dann mittels der Abfrage verknüpft wird über einen Left-Join

          Code:
          Select book.*, ifnull(o.price,book.price) AS current_price
          FROM allbooks AS book
          LEFT JOIN offer AS o ON book.isbn13=o.book_id
          WHERE book.isbn13='xxxxxxxxxxxxx';
          das * hat den Vorteil das ich auch den alten Preis noch mit habe und mit einbinden kann..

          Danke nochmal
          Thomas
          Zuletzt editiert von Enigma228; 17.09.2010, 17:22. Reason: Danke hier meine(deine) Lösung

          Comment

          Working...
          X