4 Stimmen

2 Tabellen für eine SELECT-Abfrage zusammenführen?

Zuerst hier sind die beiden Tabellen, die ich erstellt habe (ohne irrelevante Spalten)

CREATE TABLE users_history1 (
  circuit tinyint(1) unsigned NOT NULL default '0',
  userh_season smallint(4) unsigned NOT NULL default '0',
  userh_userid int(11) unsigned NOT NULL default '0',
  userh_rank varchar(2) NOT NULL default 'D',
  userh_wins int(11) NOT NULL default '0',
  userh_losses int(11) NOT NULL default '0',
  userh_points int(11) NOT NULL default '1000',
  KEY (circuit, userh_userid),
  KEY (userh_season)
) ENGINE=MyISAM;

CREATE TABLE users_ladders1 (
  circuit tinyint(1) unsigned NOT NULL default '0',
  userl_userid int(11) unsigned NOT NULL default '0',
  userl_rank char(2) NOT NULL default 'D',
  userl_wins smallint(3) NOT NULL default '0',
  userl_losses smallint(3) NOT NULL default '0',
  userl_points smallint(4) unsigned NOT NULL default '1000',
  PRIMARY KEY (circuit, userl_userid),
  KEY (userl_userid)
) ENGINE=MyISAM;

Einige Hintergrund.. diese Tabellen halten Daten für eine wettbewerbsfähige Rangliste, wo Spieler gegeneinander auf eine geordnete Rangliste nach Punkten verglichen werden. users_history1 ist eine Tabelle, die Datensätze aus früheren Saisons gespeichert enthält. users_ladders1 enthält Datensätze aus der aktuellen Saison. Ich versuche, eine Seite auf meiner Website zu erstellen, auf der die Spieler nach dem Punktedurchschnitt ihrer vorherigen und aktuellen Rekorde eingestuft werden. Hier ist die Hauptwertung für eine 1v1-Rangliste: http://vilegaming.com/league.x/standings1/3

Ich möchte aus der Datenbank aus den beiden Tabellen eine geordnete Liste von Spielern nach ihren Durchschnittspunkten aus ihren users_ladders1 und users_history1 Datensätzen auswählen. Ich habe wirklich keine Ahnung, wie man aus zwei Tabellen in einer Abfrage auswählen, aber ich werde versuchen, so allgemein wie möglich, um es zu illustrieren

Die Verwendung von Bindestrichen in den Beispielen seit SO macht es merkwürdig.

SELECT userh-points 
FROM users-history1 
GROUP BY userh-userid 
ORDER BY (total userh-points for the user)

Benötigt die Angabe GROUP BY, da einige Spieler in mehreren früheren Saisons gespielt haben können.

SELECT userl-points 
FROM users-ladders1 
ORDER BY userl-points

Ich möchte beide Tabellen in einer Abfrage kombinieren können, damit ich die Daten in Form von nach Gesamtpunkten geordneten Zeilen erhalte, und wenn möglich auch die Gesamtpunkte durch die Anzahl der eindeutigen Datensätze für den Spieler teilen, damit ich den Durchschnitt erhalte.

17voto

sgriffinusa Punkte 4133

Sie sollten eine UNION SELECT :

SELECT p.id, COUNT(p.id), SUM(p.points)
FROM (SELECT userh_userid AS id, userh_points AS points
      FROM users_history1
      UNION SELECT userl_userid, userl_points
      FROM users_ladders1) AS p
GROUP BY p.id

Die Unterabfrage ist der wichtige Teil. Sie liefert Ihnen eine einzige Tabelle, in der die Ergebnisse der aktuellen und der historischen Tabellen kombiniert sind. Sie können dann aus dieser Tabelle auswählen und mit COUNT und SUM Ihre Durchschnittswerte ermitteln.

Meine MySQL-Syntax ist ziemlich eingerostet, also entschuldigen Sie bitte. Ich hatte noch keine Gelegenheit, es auszuführen, daher bin ich nicht einmal sicher, ob es funktioniert, aber es sollte für den Anfang reichen.

1 Stimmen

Das funktioniert großartig, sgriffinusa! Ich habe jedoch ein kleines Problem. Wenn ich versuche, einen Spieler zu eliminieren, der nur einen Datensatz aus beiden Tabellen zusammen hat, bekomme ich einen Fehler. SELECT p.id, COUNT(p.id) AS pcount, SUM(p.points) FROM (SELECT userh_userid AS id, userh_points AS points FROM users_history1 UNION SELECT userl_userid, userl_points FROM users_ladders1) AS p WHERE pcount>1 GROUP BY p.id Was ich hinzugefügt habe, sind die Teile "AS pcount" und "WHERE pcount>1". Ich erhalte diese Fehlermeldung im Fehlerbericht von phpMyAdmin: Unbekannte Spalte 'pcount' in 'where clause'

1 Stimmen

MySQL mag die Verwendung von Aggregatfunktionen in einer Where-Klausel nicht. Aus dem MySQL 5-Standard: "Die HAVING-Klausel kann sich auf Aggregatfunktionen beziehen, was die WHERE-Klausel nicht kann." Verwenden Sie stattdessen das HAVING-Schlüsselwort: SELECT p.id, COUNT(p.id) AS pcount, SUM(p.points) FROM (SELECT userh_userid AS id, userh_points AS points FROM users_history1 UNION SELECT userl_userid, userl_points FROM users_ladders1) AS p GROUP BY p.id HAVING pcount > 1 dev.mysql.com/doc/refman/5.1/de/select.html lists.evolt.org/archive/Week-of-Mon-20010813/055259.html

2voto

sumeet Punkte 21

Wenn Sie eine Tabelle zusammenführen möchten und eine bestimmte Spalte aus einer Tabelle auswählen möchten und in einer anderen Tabelle alles auswählen möchten.

z.B..

Table name = test1 , test2

Abfrage:

SELECT test1.column1,test1.column2, test2.* FROM test1 ,test2

wenn Sie mit einer bestimmten Spalte verschmelzen wollen

Abfrage:

SELECT test1.column1,test1.column2, test2.* FROM test1 ,test2 where test2.column3='(what ever condition u want to pass)'

0voto

smith jonesh Punkte 1
Select col1 from test1 where id = '1'
union 
select * from table2 

Diese kann auch für die Verknüpfung mit Tabellen verwendet werden.

0 Stimmen

Am häufigsten wird JOIN für Abfragen mit mehreren Tabellen verwendet. Es gibt mehrere JOIN-Optionen, die unterschiedlich funktionieren, also lesen Sie über alle.

0 Stimmen

Union kann eine gültige Methode sein, um die Daten aus zwei Tabellen mit denselben Spalten zu kombinieren. mysqltutorial.org/sql-union-mysql.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X