2 Datenbankabfragen "mischen"
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
alibi
all
ansehen
auswahl
beispiel
benennen
code
datenbank
datum
limit
nehmen
not
null
show
spalte
spalten
tabelle
union
url
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
christian1603 schrieb:
gut! :)
HilfelG
zeig hier die genauen CREATEs von beiden tabellen (feeds, gefällt_mir), dann sag ich's dir, wie's geht. -
hemiolos schrieb:
christian1603 schrieb:
gut! :)
HilfelG
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 :/ -
christian1603 schrieb:
das ist jäckchen wie höschen!
... Naja die Tabellen sind nicht identisch...
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.
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.)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)
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 -
hemiolos schrieb:
christian1603 schrieb:
das ist jäckchen wie höschen!
... Naja die Tabellen sind nicht identisch...
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.
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.)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)
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! -
christian1603 schrieb:
ja! ich bin zwar nicht sehr sexistisch, aber da trift frau besser ;) nichts für ungut, ich habe dir trotzdem gerne geholfen.
... Krass man,...
ja! und dann auch einen guten rutsch ins neue jahr!
Beitrag zuletzt geändert: 28.12.2011 1:11:56 von hemiolos -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage