kostenloser Webspace werbefrei: lima-city


2 Datenbankabfragen "mischen"

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    Hallo LC,
    ich habe eine eigene Community geschrieben. Dort kann man z.b Feeds schreiben oder zum Beispiel bei Videos auf Gefällt mir klicken. Ich habe eine Tabelle ein meiner Datenbank Feeds und eine Tabelle "gefällt_mir".
    Bisher habe ich beides unabhängig voneinander ausgegeben.
    Nun will ich die abfragen nach Datum Sortiert mischen.

    Bisher hab ich beides unabhängig von einander ausgegeben:
    SELECT * FROM feeds Where autor = $userid ORDER BY datum
    -> Feed 1 21.12.2011
    Feed 2 19.12.2011

    SELECT * FROM gefällt_mir Where autor = $userid ORDER BY datum
    -> like 1 20.12.2011
    like 2 18.12.2011

    Nun will ich aber so eine Ausgabe:
    -> Feed 1 21.12.2011
    like 1 20.12.2011
    Feed 2 19.12.2011
    like 2 18.12.2011

    hab aber echt keine ahnung ich ich das machen soll^^ Ich denke ich muss beides abfragen und in eine Extra Area schreiben oder? Weiß aber nicht wie ich das mache...
    Hilfe
    lG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. die einfachste möglichkeit wäre, du holst dir aus beiden tabellen die abfragen rein, packst die in arrays und das sortierst du dann. am einfachsten geht das, wenn du über ein Timestamp die sortierung machst, sonst wirds zu umständlich...

    andere möglichkeit ist der "UNION ALL" befehl, selber hab ich ihn nciht ausprobiert.

    Du schaffst dir 2 abfragen mit identischen spalten und UNION ALL verbindet die...


    http://sql.1keydata.com/de/sql-union-all.php
  4. christian1603 schrieb:
    HilfelG
    gut! :)
    zeig hier die genauen CREATEs von beiden tabellen (feeds, gefällt_mir), dann sag ich's dir, wie's geht.
  5. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    hemiolos schrieb:
    christian1603 schrieb:
    HilfelG
    gut! :)
    zeig hier die genauen CREATEs von beiden tabellen (feeds, gefällt_mir), dann sag ich's dir, wie's geht.


    Naja die Tabellen sind nicht identisch...
    CREATE TABLE IF NOT EXISTS `gefällt_mir` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `was` varchar(11) NOT NULL,
      `user` varchar(11) NOT NULL,
      `wasid` varchar(11) NOT NULL,
     `time` varchar(50) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=42 ;


    was= (Was bewertet wurde feed, video usw.) Mit hilfe der "wasid" wird mit einer weiteren SQL Abfrage das objekt ausgegeben.

    CREATE TABLE IF NOT EXISTS `feeds` (
      `time` varchar(50) NOT NULL,
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `autor` varchar(11) NOT NULL,
      `feed` text NOT NULL,
      `alle` varchar(11) NOT NULL,
      `gelesen` varchar(500) NOT NULL,
      `gut` int(11) NOT NULL,
      `schlecht` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `Index_2` (`time`,`id`,`autor`,`gelesen`,`alle`) USING BTREE
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=656 ;


    Ich denke nicht dass das für diese Funktion der Ideale Aufbau ist aber die Tabellen sind halt vollerdaten..
    lg :/
  6. christian1603 schrieb:
    ... Naja die Tabellen sind nicht identisch...
    das ist jäckchen wie höschen!
    dein datenbank design ist wohl nicht sehr ideal, aber ...

    zuerst ein beispiel (dazu nehmen wir die pseudo-datenbank 'information_schema' und die tabelle 'COLUMNS'). mal create ansehen:
    mysql> show create table information_schema.COLUMNS;
    ...
    | COLUMNS | CREATE TEMPORARY TABLE `COLUMNS` (
      `TABLE_CATALOG` varchar(512) DEFAULT NULL,
      `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
      `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
      `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',
      `ORDINAL_POSITION` bigint(21) unsigned NOT NULL DEFAULT '0',
      `COLUMN_DEFAULT` longtext,
      `IS_NULLABLE` varchar(3) NOT NULL DEFAULT '',
      `DATA_TYPE` varchar(64) NOT NULL DEFAULT '',
      `CHARACTER_MAXIMUM_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `CHARACTER_OCTET_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `NUMERIC_PRECISION` bigint(21) unsigned DEFAULT NULL,
      `NUMERIC_SCALE` bigint(21) unsigned DEFAULT NULL,
      `CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,
      `COLLATION_NAME` varchar(32) DEFAULT NULL,
      `COLUMN_TYPE` longtext NOT NULL,
      `COLUMN_KEY` varchar(3) NOT NULL DEFAULT '',
      `EXTRA` varchar(27) NOT NULL DEFAULT '',
      `PRIVILEGES` varchar(80) NOT NULL DEFAULT '',
      `COLUMN_COMMENT` varchar(255) NOT NULL DEFAULT ''
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

    für 2 abfragen nehmen wir zwei beliebige column-auswahle, die wir dann mit 'UNION' zusammenfassen (von welchen tabellen die kommen ist egal, ich nehme jetzt mal die selbe.
    mysql> (
        -> SELECT table_catalog,    -- varchar(512)
        ->        ordinal_position, -- bigint(21)
        ->        is_nullable,      -- varchar(3)
        ->        '~' AS alibi      -- pseudo auswahl für die spalte 'column_name' der zweiten abfrage
        -> FROM information_schema.columns
        -> LIMIT 2
        -> )
        -> UNION
        -> (
        -> SELECT ordinal_position, -- bigint(21)
        ->        is_nullable,      -- varchar(3)
        ->        table_catalog,    -- varchar(512)
        ->        column_name       -- varchar(64)
        -> FROM information_schema.columns
        -> LIMIT 2
        -> );
    +---------------+------------------+-------------+----------------------+
    | table_catalog | ordinal_position | is_nullable | alibi                |
    +---------------+------------------+-------------+----------------------+
    | NULL          | 1                | NO          | ~                    |
    | NULL          | 2                | NO          | ~                    |
    | 1             | NO               | NULL        | CHARACTER_SET_NAME   |
    | 2             | NO               | NULL        | DEFAULT_COLLATE_NAME |
    +---------------+------------------+-------------+----------------------+
    4 rows in set (21.39 sec)
    wie du sehen kannst, es ist wichtig die anzahl der spalten in den beiden 'SELECT's abzugleichen! (das bisher ist alles vom lima gekommen, also funktioniert auch so.)
    dass das so nicht sehr lustig zum lesen ist, liegt auf der hand! im richtigen query musst du die spalten mit 'AS' so benennen, dass man es weißt, wo man eben ist.

    daher kann ich dir - natürlich ohne prüfung - für deinen fall so etwas vorschlagen:
    <?php
    $q = <<< EOT
    (
    SELECT id,             -- int(11)
           '' AS autor,    -- varchar(11)
           was,            -- varchar(11)
           wasid,          -- varchar(11)
           user,           -- varchar(11)
           '' AS feed,     -- text
           '' AS alle,     -- varchar(11)
           '' AS gelesen,  -- varchar(500)
           0 AS gut,      -- int(11)
           0 AS schlecht, -- int(11)
           time            -- varchar(50)
    FROM gefällt_mir
    )
    UNION
    (
    SELECT id,             -- int(11)
           autor,          -- varchar(11)
           '' AS was,      -- varchar(11)
           '' AS wasid,    -- varchar(11)
           '' AS user,     -- varchar(11)
           feed,           -- text
           alle,           -- varchar(11)
           gelesen,        -- varchar(500)
           gut,            -- int(11)
           schlecht,       -- int(11)
           time            -- varchar(50)
    FROM feeds
    )
    ORDER BY time
    -- LIMIT n -- wenn du 'LIMIT n' brauchst, nimm die ersten 3 zeichen ('-- ') vom zeilenanfang
    EOT;
    
    $res = ($r = mysql_query($q)) ?
      $r:
      exit('<pre>' . print_r(array(mysql_errno(), mysql_error()), true));
    
    // wenn du also hier ankommst, hast in $res irgendwas ;)

    lass es mir wissen, ob's in ordnung ist :o)

    Beitrag zuletzt geändert: 26.12.2011 12:17:17 von hemiolos
  7. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    hemiolos schrieb:
    christian1603 schrieb:
    ... Naja die Tabellen sind nicht identisch...
    das ist jäckchen wie höschen!
    dein datenbank design ist wohl nicht sehr ideal, aber ...

    zuerst ein beispiel (dazu nehmen wir die pseudo-datenbank 'information_schema' und die tabelle 'COLUMNS'). mal create ansehen:
    mysql> show create table information_schema.COLUMNS;
    ...
    | COLUMNS | CREATE TEMPORARY TABLE `COLUMNS` (
      `TABLE_CATALOG` varchar(512) DEFAULT NULL,
      `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
      `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
      `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',
      `ORDINAL_POSITION` bigint(21) unsigned NOT NULL DEFAULT '0',
      `COLUMN_DEFAULT` longtext,
      `IS_NULLABLE` varchar(3) NOT NULL DEFAULT '',
      `DATA_TYPE` varchar(64) NOT NULL DEFAULT '',
      `CHARACTER_MAXIMUM_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `CHARACTER_OCTET_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `NUMERIC_PRECISION` bigint(21) unsigned DEFAULT NULL,
      `NUMERIC_SCALE` bigint(21) unsigned DEFAULT NULL,
      `CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,
      `COLLATION_NAME` varchar(32) DEFAULT NULL,
      `COLUMN_TYPE` longtext NOT NULL,
      `COLUMN_KEY` varchar(3) NOT NULL DEFAULT '',
      `EXTRA` varchar(27) NOT NULL DEFAULT '',
      `PRIVILEGES` varchar(80) NOT NULL DEFAULT '',
      `COLUMN_COMMENT` varchar(255) NOT NULL DEFAULT ''
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

    für 2 abfragen nehmen wir zwei beliebige column-auswahle, die wir dann mit 'UNION' zusammenfassen (von welchen tabellen die kommen ist egal, ich nehme jetzt mal die selbe.
    mysql> (
        -> SELECT table_catalog,    -- varchar(512)
        ->        ordinal_position, -- bigint(21)
        ->        is_nullable,      -- varchar(3)
        ->        '~' AS alibi      -- pseudo auswahl für die spalte 'column_name' der zweiten abfrage
        -> FROM information_schema.columns
        -> LIMIT 2
        -> )
        -> UNION
        -> (
        -> SELECT ordinal_position, -- bigint(21)
        ->        is_nullable,      -- varchar(3)
        ->        table_catalog,    -- varchar(512)
        ->        column_name       -- varchar(64)
        -> FROM information_schema.columns
        -> LIMIT 2
        -> );
    +---------------+------------------+-------------+----------------------+
    | table_catalog | ordinal_position | is_nullable | alibi                |
    +---------------+------------------+-------------+----------------------+
    | NULL          | 1                | NO          | ~                    |
    | NULL          | 2                | NO          | ~                    |
    | 1             | NO               | NULL        | CHARACTER_SET_NAME   |
    | 2             | NO               | NULL        | DEFAULT_COLLATE_NAME |
    +---------------+------------------+-------------+----------------------+
    4 rows in set (21.39 sec)
    wie du sehen kannst, es ist wichtig die anzahl der spalten in den beiden 'SELECT's abzugleichen! (das bisher ist alles vom lima gekommen, also funktioniert auch so.)
    dass das so nicht sehr lustig zum lesen ist, liegt auf der hand! im richtigen query musst du die spalten mit 'AS' so benennen, dass man es weißt, wo man eben ist.

    daher kann ich dir - natürlich ohne prüfung - für deinen fall so etwas vorschlagen:
    <?php
    $q = <<< EOT
    (
    SELECT id,             -- int(11)
           '' AS autor,    -- varchar(11)
           was,            -- varchar(11)
           wasid,          -- varchar(11)
           user,           -- varchar(11)
           '' AS feed,     -- text
           '' AS alle,     -- varchar(11)
           '' AS gelesen,  -- varchar(500)
           0 AS gut,      -- int(11)
           0 AS schlecht, -- int(11)
           time            -- varchar(50)
    FROM gefällt_mir
    )
    UNION
    (
    SELECT id,             -- int(11)
           autor,          -- varchar(11)
           '' AS was,      -- varchar(11)
           '' AS wasid,    -- varchar(11)
           '' AS user,     -- varchar(11)
           feed,           -- text
           alle,           -- varchar(11)
           gelesen,        -- varchar(500)
           gut,            -- int(11)
           schlecht,       -- int(11)
           time            -- varchar(50)
    FROM feeds
    )
    ORDER BY time
    -- LIMIT n -- wenn du 'LIMIT n' brauchst, nimm die ersten 3 zeichen ('-- ') vom zeilenanfang
    EOT;
    
    $res = ($r = mysql_query($q)) ?
      $r:
      exit('<pre>' . print_r(array(mysql_errno(), mysql_error()), true));
    
    // wenn du also hier ankommst, hast in $res irgendwas ;)

    lass es mir wissen, ob's in ordnung ist :o)

    Krass man,
    Danke wenn man noch Karma vergeben könne *100 mal klick*
    Es klappt danke!
  8. christian1603 schrieb:
    ... Krass man,...
    ja! ich bin zwar nicht sehr sexistisch, aber da trift frau besser ;) nichts für ungut, ich habe dir trotzdem gerne geholfen.
    ja! und dann auch einen guten rutsch ins neue jahr!

    Beitrag zuletzt geändert: 28.12.2011 1:11:56 von hemiolos
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!