php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.04.2007, 14:03  
Erfahrener Benutzer
 
Registriert seit: 09.02.2005
Beiträge: 256
Matthiasnet
Standard where Abfrage in anderer Tabelle??

Hallo,

wollte Fragen ob folgendes möglich wäre und wenn ja, wie ich den Befehl angeben muss?
Hier ein Beispiel:
Code:
SELECT id FROM `events` WHERE id LIKE '%(nun soll auf die Tabelle benutzer zugegriffen werden und die ids von der spalte favourites angegebn werden)%'
Also ich habe in der Tabelle events jedes Event mit einer eindeutigen ID.
In der Tabelle Benutzer stehen in der Spalte favourites alle Ids, die halt angezeigt werden sollen nach dem Format id, id, id, .....

Ist es den nun möglich irgendwie auf die andere Tabelle überzugehen??

Würde mich über Hilfe freuen

Grüße

Matthiasnet
Matthiasnet ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.04.2007, 14:50  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Dein Datenbankdesign klingt ziemlich kaputt.

Du solltest das ganze mal normalisieren ( wenn du nicht weißt was das ist oder wie das geht - google ist dein Freund ). Dann ist das ganze ganz einfach über JOINs zu lösen.

Ansonsten: Poste mal ein paar Beispiel-Datensätze und dein gewünschtes Query-Ergebnis.
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 10.04.2007, 15:58  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
In der Tabelle Benutzer stehen in der Spalte favourites alle Ids, die halt angezeigt werden sollen nach dem Format id, id, id, .....
Das ist Schwachfug! Die Abfrage, die du schreiben müsstest muss String-Ersetzungen en mass machen und das ist nicht Sinn und Zweck beim Datenbank-Einsatz.

Wie Agrajag schon sagte ist das Tabellen-Design nicht sinnvoll. Für diesen Anwendungsfall arbeitet der clevere Entwickler mit 3 Tabellen:

1) benutzer
2) events
3) ass_benutzer_events

Tabelle 3 speichert jeweils den PK des Benutzers und den PK des Events. Somit kannst du durch mehrere Einträge in ass_benutzer_events eine 1:n, n:1 und n:m-Beziehung zwischen Benutzer und Event aufbauen und mit JOINs sauber abfragen. Das Keyword "ass" steht übrigens für "Assoziation"!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 10.04.2007, 16:02  
Erfahrener Benutzer
 
Registriert seit: 09.02.2005
Beiträge: 256
Matthiasnet
Standard

Hatte ja bei google nichts hilfreiches für mich gefunden...hab mir nun mal was zu Joins durchgelesen, aber iregndwie krieg ich den Befehl nicht so wie ich ihn brauche...
DBdesign sollte so eig. sinnvoll sein oder fällt dir was besseres ein? :wink:

Hier ein ungefährer Aufbau beider Tabellen:
Tabelle benutzer:
ID|Username|weitere pers. Daten....|favouriten
4 |Matthiasnet| .... | 9, 10 , 15
x |xxxx| .... | 85, 12 , 4.....

Tabelle events:
ID|Username des Einträgers|weitere Infos....
4 |Matthiasnet| ....
9 |xxxx| ....

Da es nun zum zweiten Mal kommt, versteh ehrlich gesagt nicht ganz was an dieser Methode schlechter sein soll?? So hab ich doch alles in 2 Tabellen und es ist alles dem passenden User zugeordnet
Matthiasnet ist offline   Mit Zitat antworten
Alt 10.04.2007, 16:23  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Matthiasnet,

ich hab in meinem Post bereits erläutert, dass sich die Abfrage auf ein Feld mit dem Inhalt

Code:
1,2,3,4,56,1345,4356
nur bedingt schön und vor allem wenig performant gestaltet. Um die Events zu einem User - oder umgekehrt - zu erhalten muss man zuerst die Spalte mit den IDs abfragen, dann den String zerlegen und dann die jeweils andere Tabelle auf diese IDs abfragen. Das kann man i.d.R. nicht mit _einem_ Query machen. Würdest du wie beschrieben eine Beziehungs-Tabelle einsetzen, geht das mit einem einzigen Query per JOIN.

Liegt folgendes Tabellen-Design zu Grunde

Code:
Tabelle benutzer:
--------------------
ID | Usename | ...
1   | christian  | ...
2   | ...           | ...

Tabelle events:
--------------------
ID | Name    | ...
1   | Fußball  | ...
2   | ...         | ...

Tabelle ass_benutzer_events:
----------------------------------
ID | User | Event 
1   | 1     | 1
2   | 1     | 2
3   | 2     | 1
so kannst du beispielsweise alle Events eines bestimmten Benutzers mit

Code:
SELECT * FROM events
INNER JOIN ass_benutzer_events ON benutzer.ID = ass_benutzer_events.Event
INNER JOIN benutzer ON ass_benutzer_events.User = benutzer.ID
WHERE benutzer.ID = '$ID';
abfragen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 10.04.2007, 16:41  
Erfahrener Benutzer
 
Registriert seit: 09.02.2005
Beiträge: 256
Matthiasnet
Standard

Stimmt leuchtet mir ein.... hab nun versucht deine Methode anzuwenden, aber immer wird mir ausgegeben:
#1054 - Unknown column 'benutzer.id' in 'on clause'

Weiß ehrlich gesagt nicht woran es liegt...die Tabelle heißt benutzer und das Id Feld heißt id und ist auto_increment....(Groß-Kleinschreibung wurde beachtet...)

Hatte zuvor noch nie damit gearbeitet, deshalb weiß ich eldier nicht, wie sowas aufgebaut werden muss.....
Matthiasnet ist offline   Mit Zitat antworten
Alt 10.04.2007, 17:12  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Matthiasnet,

dein Tabellen-Layout ist offensichtlich anders wie mein Code. Es war eben nur ein Beispiel und du musst mein Statement eben an eine Anforderungen anpassen. Die Meldung sagt aus, dass es keine Spalte "id" in der Tabelle "benutzer" gibt. Du musst diesen Teil mit der gültigen PK-Spalte aus deiner Tabelle "benutzer" füllen.

Poste zur Sicherheit nochmal das komplette Statement und dein jetziges Tabellen-Layout (mit den 3 Tabellen).
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 10.04.2007, 17:39  
Erfahrener Benutzer
 
Registriert seit: 09.02.2005
Beiträge: 256
Matthiasnet
Standard

Hallo dr.e,

habe eig. alles soweit beachtet und es gibt eine spalte namens id in der Tabelle benutzer....
Hier meien Tabellenstrucktur:
Zitat:
CREATE TABLE `benutzer` (
`id` int(11) NOT NULL auto_increment,
`anrede` text NOT NULL,
`username` text NOT NULL,
`vorname` text NOT NULL,
`nachname` text NOT NULL,
`bday_tag` int(2) NOT NULL default '0',
`bday_monat` int(2) NOT NULL default '0',
`bday_jahr` int(4) NOT NULL default '0',
`address` text NOT NULL,
`address2` text NOT NULL,
`plz` text NOT NULL,
`ort` text NOT NULL,
`mail` text NOT NULL,
`land` text NOT NULL,
`password` text NOT NULL,
`status` int(1) NOT NULL default '0',
`favouriten` longtext NOT NULL,
PRIMARY KEY (`id`)
)

CREATE TABLE `ass_benutzer_events` (
`ID` int(11) NOT NULL auto_increment,
`User` int(11) NOT NULL,
`Event` int(11) NOT NULL,
PRIMARY KEY (`ID`)
)

CREATE TABLE `events` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(199) NOT NULL default '',
`century` int(2) unsigned zerofill NOT NULL default '00',
`years` int(2) unsigned zerofill NOT NULL default '00',
`month` varchar(30) NOT NULL default '',
`day` int(2) unsigned zerofill NOT NULL default '00',
`hour` int(2) unsigned zerofill NOT NULL default '00',
`minute` int(2) unsigned zerofill default '00',
`titel` varchar(199) NOT NULL default '',
`beschreibung` longtext NOT NULL,
`datei1` varchar(199) NOT NULL,
`datei2` varchar(199) NOT NULL,
`datei3` varchar(199) NOT NULL,
`datei4` varchar(199) NOT NULL,
`datei5` varchar(199) NOT NULL,
`status` varchar(199) NOT NULL default '',
`privat_user` longtext NOT NULL,
`klicks` int(11) NOT NULL default '0',
`kategorie` varchar(199) NOT NULL,
`link_melden` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
)
Und das ist der auszuführende Befehl:
Zitat:
SELECT * FROM events
INNER JOIN ass_benutzer_events ON benutzer.id = ass_benutzer_events.Event
INNER JOIN benutzer ON ass_benutzer_events.User = benutzer.id
WHERE benutzer.id = '1'
Wenn du mal drüberschauen könntest wär ich dir sehr dankbar

Grüße

Matthias
Matthiasnet ist offline   Mit Zitat antworten
Alt 11.04.2007, 10:00  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Matthiasnet,

ich habe das ganze nochmal für dich getestet. Folgenes ist als Test bei mir eingespielt worden:

Code:
DROP TABLE IF EXISTS `ass_benutzer_events`;
CREATE TABLE IF NOT EXISTS `ass_benutzer_events` (
  `ID` int(11) NOT NULL auto_increment,
  `User` int(11) NOT NULL default '0',
  `Event` int(11) NOT NULL default '0',
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

INSERT INTO `ass_benutzer_events` (`ID`, `User`, `Event`) VALUES 
(1, 1, 1),
(2, 1, 2),
(4, 1, 4),
(5, 2, 2),
(6, 2, 3),
(7, 8, 1),
(8, 8, 4),
(9, 7, 3),
(10, 7, 4),
(11, 6, 4),
(12, 6, 1);

DROP TABLE IF EXISTS `benutzer`;
CREATE TABLE IF NOT EXISTS `benutzer` (
  `id` int(11) NOT NULL auto_increment,
  `anrede` text NOT NULL,
  `username` text NOT NULL,
  `vorname` text NOT NULL,
  `nachname` text NOT NULL,
  `bday_tag` int(2) NOT NULL default '0',
  `bday_monat` int(2) NOT NULL default '0',
  `bday_jahr` int(4) NOT NULL default '0',
  `address` text NOT NULL,
  `address2` text NOT NULL,
  `plz` text NOT NULL,
  `ort` text NOT NULL,
  `mail` text NOT NULL,
  `land` text NOT NULL,
  `password` text NOT NULL,
  `status` int(1) NOT NULL default '0',
  `favouriten` longtext NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

INSERT INTO `benutzer` (`id`, `anrede`, `username`, `vorname`, `nachname`, `bday_tag`, `bday_monat`, `bday_jahr`, `address`, `address2`, `plz`, `ort`, `mail`, `land`, `password`, `status`, `favouriten`) VALUES 
(1, '', 'christian', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(2, '', 'Thomas', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(3, '', 'Markus', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(4, '', 'Andreas', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(5, '', 'Martina', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(6, '', 'Gabi', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(7, '', 'Kerstin', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, ''),
(8, '', 'Tamara', '', '', 0, 0, 0, '', '', '', '', '', '', '', 0, '');

DROP TABLE IF EXISTS `events`;
CREATE TABLE IF NOT EXISTS `events` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(199) NOT NULL default '',
  `century` int(2) unsigned zerofill NOT NULL default '00',
  `years` int(2) unsigned zerofill NOT NULL default '00',
  `month` varchar(30) NOT NULL default '',
  `day` int(2) unsigned zerofill NOT NULL default '00',
  `hour` int(2) unsigned zerofill NOT NULL default '00',
  `minute` int(2) unsigned zerofill default '00',
  `titel` varchar(199) NOT NULL default '',
  `beschreibung` longtext NOT NULL,
  `datei1` varchar(199) NOT NULL default '',
  `datei2` varchar(199) NOT NULL default '',
  `datei3` varchar(199) NOT NULL default '',
  `datei4` varchar(199) NOT NULL default '',
  `datei5` varchar(199) NOT NULL default '',
  `status` varchar(199) NOT NULL default '',
  `privat_user` longtext NOT NULL,
  `klicks` int(11) NOT NULL default '0',
  `kategorie` varchar(199) NOT NULL default '',
  `link_melden` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `events` (`id`, `username`, `century`, `years`, `month`, `day`, `hour`, `minute`, `titel`, `beschreibung`, `datei1`, `datei2`, `datei3`, `datei4`, `datei5`, `status`, `privat_user`, `klicks`, `kategorie`, `link_melden`) VALUES 
(1, '', 00, 00, '', 00, 00, 00, 'Erstes Event', '', '', '', '', '', '', '', '', 0, '', ''),
(2, '', 00, 00, '', 00, 00, 00, 'Zweites Event', '', '', '', '', '', '', '', '', 0, '', ''),
(3, '', 00, 00, '', 00, 00, 00, 'Drittes Event', '', '', '', '', '', '', '', '', 0, '', ''),
(4, '', 00, 00, '', 00, 00, 00, 'Viertes Event', '', '', '', '', '', '', '', '', 0, '', '');
Das Statement muss so heißen

Code:
SELECT events.titel FROM events
INNER JOIN ass_benutzer_events ON events.ID = ass_benutzer_events.Event
INNER JOIN benutzer ON ass_benutzer_events.User = benutzer.id
WHERE benutzer.id = '1'
Dann ergibt sich

Code:
Erstes Event 
Zweites Event 
Viertes Event
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 11.04.2007, 10:45  
Erfahrener Benutzer
 
Registriert seit: 09.02.2005
Beiträge: 256
Matthiasnet
Standard

klappt nun einwandfrei.
Noch ein recht herzliches Dankeschön an dich, dass du dir extra die Arbeit gemacht hast und du dafür Zeit gefunden hast...
THX :wink:
Matthiasnet ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Tabelle von anderer Website in eigene übernehmen (+aktualisieren) Softyx PHP Tipps 2008 31 07.07.2008 10:16
SQL-Abfrage mit Wert aus anderer Tabelle füllen maeck Datenbanken 2 25.07.2007 20:36
ORDER BY ... aus anderer Tabelle? CHRIS Datenbanken 26 04.05.2007 20:24
Mehrfach where in der ABfrage? Kori Datenbanken 4 16.01.2007 16:46
SELECT WHERE datetime abfrage - Optimierung mrSpok Datenbanken 15 23.03.2006 19:08
WHERE abfrage nach Datum Datenbanken 2 06.03.2006 16:42
WHERE Falsche Abfrage? Kein MySQL Fehler PHP Tipps 2005-2 10 30.09.2005 10:43
Nach MySQL abfrage noch WHERE ? atom-dragon PHP Tipps 2005-2 6 12.06.2005 04:21
Tabellenenum aus anderer Tabelle Datenbanken 3 11.05.2005 10:07
Abfrage einer Tabelle aus SQL-Feld Datenbanken 9 05.03.2005 10:00
[Erledigt] Tabelle existiert, if Abfrage Datenbanken 9 15.02.2005 14:00
Abfrage mit id aus anderer Tabelle suter PHP Tipps 2004-2 15 16.12.2004 14:25
[Erledigt] SELECT * FROM tabelle WHERE id 'zwischen' 10 AND 20 Datenbanken 2 28.11.2004 14:37
Datensätze löschen für die kein Eintrag in anderer Tabelle.. robo47 Datenbanken 7 10.11.2004 09:42
Verweis nach id-Vorgabe aus anderer Tabelle "ergänzen&a Heart PHP Tipps 2004 2 28.06.2004 08:02

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
where von anderer tabelle, sql abfrage where aus anderer tabelle, insert into in bestimmtes feld der tabelle mit id, where abfrage aus anderer tabelle, create table aus anderer tabelle

Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.