php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 03-07-2015, 10:23
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard MySQL / PHP Alle überschneidungen anzeigen

Guten Morgen

Ich habe hier folgende Datenbankstruktur und würde gerne die Überschneidungen finden. Da ich bisher nichts konkretes gefunden habe weiss ich nicht ob es vielleicht sogar mit mysql direkt möglich ist:

Da die Datenbankstruktur sehr gross ist habe ich es hier mal etwas abgekürzt und geändert. Ich hoffe so ist es verständlicher bei meinen Wirren gedankengängen

Code:
obst
OID | obst
1 | Apfel
2 | Banane
3 | Orange
4 | Mandarine
....

person
PID | person
1 | Hans
2 | Peter
3 | Marlise
4 | Sandra
...

obst_to_person
OID |PID
1 | 1 (Apfel - Heinz)
2 | 1 (Banane - Heinz)
3 | 1 (Orange - Heinz)
1 | 2 (Apfel - Peter)
3 | 2 (Orange - Peter)
1 | 3 (Apfel - Marlise)
2 | 3 (Banane - Marlise)
3 | 3 (Orange - Marlise)
....
Nun habe ich eine Variable:
PHP-Code:
$personen '1,2'//Alle Personen von denen ich die Übereinstimmungen möchte 
Als ergebnis hätte ich nun gerne Apfel und Orange

Es wäre super wenn mir da jemand eine gute lösung hätte. Ich hoffe ich konnte es einigermassen gut erklären.

Gruss

Koda
Mit Zitat antworten
  #2 (permalink)  
Alt 06-07-2015, 12:24
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Koda Beitrag anzeigen
Guten Morgen
Mahlzeit!
Zitat:
Zitat von Koda Beitrag anzeigen
Ich habe hier folgende Datenbankstruktur und würde gerne die Überschneidungen finden. Da ich bisher nichts konkretes gefunden habe weiss ich nicht ob es vielleicht sogar mit mysql direkt möglich ist: ...
Ja, ist es.
Zitat:
Da die Datenbankstruktur sehr gross ist habe ich es hier mal etwas abgekürzt und geändert. (...)
Sehr schön. Damit kann man arbeiten.

Zitat:
Nun habe ich eine Variable:
PHP-Code:
$personen '1,2'//Alle Personen von denen ich die Übereinstimmungen möchte 
Als ergebnis hätte ich nun gerne Apfel und Orange
Eigentlich ist das Ganze gar nicht so kompliziert: Du hast zwei Tabellen und willst aus einer davon dein Ergebnis haben. Beide sind über die dritte Tabelle miteinander zu verknüpfen.

(Hinweis: Zu meinem besseren Verständnis habe ich einige Namen leicht abgeändert[0]. Falls sie dir nicht gefallen, musst du sie wieder rückbenennen.)

Wir haben also drei Tabellen:
PHP-Code:
$db = new PDO('sqlite::memory:');
$db->query('create table oebste (ID INTEGER PRIMARY KEY, obst TEXT)');
// ...

$db = new PDO('sqlite::memory:');
$db->query('create table personen (ID INTEGER PRIMARY KEY, person TEXT)');
// ...

$db = new PDO('sqlite::memory:');
$db->query('create table wermagwas (obstID INTEGER REFERENCES oebste, personID INTEGER REFERENCES personen)');
// ... 
Wir brauchen die Spalte "obst" aus der Tabelle "oebste":
PHP-Code:
'select oebste.obst ...' 
Wir benötigen alle drei Tabellen zur Verknüpfung:
PHP-Code:
'... from oebste, personen, wermagwas ...' 
Das erste Auswahlkriterium sind die zwei Primärschlüssel 1 und 2 aus der Tabelle "personen":
PHP-Code:
where personen.ID in (12
Dann sagen wir der Datenbank welche Fremdschlüssel die Verknüpfungstabelle "wermagwas" mit den anderen beiden Tabellen verbinden:
PHP-Code:
... wermagwas.personID personen.pid and wermagwas.obstID oebste.oid 
Das gibt mehrfache Ansammlungen von Früchten gleicher Art. Die beseitigen wir mit "GROUP BY":
PHP-Code:
... group by oebste.obst 
Im Ganzen Satz:
PHP-Code:
$sql 'select oebste.obst
    from oebste, personen, wermagwas
    where
        personen.ID in (1, 2)
        and wermagwas.personID = personen.ID
        and wermagwas.obstID = oebste.ID
    group by
        oebste.obst
    '

... und hier der dazugehörige PHP-Quellcode für PDO und SQLite (für MySQL muss du vermutlich die Spalten-Typen in den "CREATE TABLE"-Statements anpassen):
PHP-Code:
$oebste = array (
    array (
1'Apfel'),
    array (
2'Banane'),
    array (
3'Orange'),
    array (
4'Mandarine'),
);
$personen = array (
    array (
1'Hans'),
    array (
2'Peter'),
    array (
3'Marlise'),
    array (
4'Sandra'),
);
$wermagwas = array (
    array (
11),
    array (
11),
    array (
31),
    array (
12),
    array (
32),
    array (
13),
    array (
23),
    array (
33),
);


$db = new PDO('sqlite::memory:');

$db->query('create table oebste (ID INTEGER PRIMARY KEY, obst TEXT)');
$stmt $db->prepare('insert into oebste values (?, ?)');
foreach (
$oebste as $record) {
    
$stmt->execute(array_values($record));
}
unset (
$stmt);

$db->query('create table personen (ID INTEGER PRIMARY KEY, person TEXT)');
$stmt $db->prepare('insert into personen values(?, ?)');
foreach (
$personen as $record) {
    
$stmt->execute(array_values($record));
}
unset (
$stmt);

$db->query('create table wermagwas (obstID INTEGER REFERENCES oebste, personID INTEGER REFERENCES personen)');
$stmt $db->prepare('insert into wermagwas values (?, ?)');
foreach (
$wermagwas as $record) {
    
$stmt->execute(array_values($record));
}
unset (
$stmt);

// , personen.person, personen.pid // if all relevant columns needed
$sql 'select oebste.obst
    from oebste, personen, wermagwas
    where
        personen.ID in (1, 2)
        and wermagwas.personID = personen.ID
        and wermagwas.obstID = oebste.ID
    group by
        oebste.obst
    '
;

if (!
$stmt $db->prepare($sql)) {
    
Debug::writefln('error: %S %S'$db->errorCode(), $db->errorInfo());
}

$stmt->setFetchMode(PDO::FETCH_ASSOC);

if (!
$stmt->execute()) {
    
Debug::writefln('error: %S %S'$stmt->errorCode(), $stmt->errorInfo());
}

foreach (
$stmt as $idx => $record) {
    
Debug::writefln('row: %S :: %S'$idx$record);
}
Debug::writefln('... end');
exit();

// Debug::writefln() fuer Ausgabe als HTML:
class Debug {
    static function 
writefln() {
        
$args func_get_args();
        
vprintf(
            
strtr(
                
array_shift($args),
                array (
'%S' => '%s')
            ),
            
array_map(
                function (
$var) {
                    if (
is_scalar($var)) {
                        return 
sprintf('<code>%s</code>'htmlspecialchars($var));
                    }
                    
ob_start();
                    
var_dump($var);
                    return 
'<pre>' htmlspecialchars(ob_get_clean()) . '</pre>';
                },
                
$args
            
)
        );
    }

--
[0] "Fruechte" und "Frucht" sind vermutlich brauchbarere Namen.
Siehe auch bei der Konkurrenz:
* Datenbank-Richtlinien - PHP Forum: phpforum.de
* (Sinnvollste) SQL Namenskonventionen - php.de

Geändert von fireweasel (06-07-2015 um 12:25 Uhr) Grund: typo
Mit Zitat antworten
  #3 (permalink)  
Alt 06-07-2015, 14:23
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Sinngemäß (nicht getestet) wohl zum Beispiel so:

Code:
SELECT DISTINCT obst.obst
FROM person
LEFT JOIN obst_to_person
ON person.PID = obst_to_person.PID
LEFT JOIN obst
ON obst_to_person.OID = obst.OID
WHERE person.PID IN (1, 2)
(Edit: Oh, hatte das Tab nicht aktualisiert und die andere Antwort nicht gesehen.)

Geändert von mermshaus (06-07-2015 um 14:25 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 06-07-2015, 20:37
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

Nabend

Wow. Vielen Dank euch zwei.

Gruss

Koda
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Überschneidungen in Diagrammen / imageellipse tAiChi PHP Developer Forum 3 21-12-2005 12:53
alle Einträge anzeigen Blatolo SQL / Datenbanken 5 15-07-2004 17:09
Alle bilder anzeigen thesilencer5 PHP Developer Forum 1 05-03-2004 19:05
Alle Datenbank zeilen anzeigen ginod SQL / Datenbanken 9 04-02-2004 22:31
ICQ -alle Statuse anzeigen- Payne_of_Death Apps und PHP Script Gesuche 9 29-12-2002 13:13

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:57 Uhr.