php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.01.2010, 21:34  
Neuer Benutzer
 
Registriert seit: 28.01.2010
Beiträge: 5
PHP-Kenntnisse:
Anfänger
Flot befindet sich auf einem aufstrebenden Ast
Standard MQSL Index aus a+b = index

Hallo zusammen,

Ich suche nach einer Möglichkeit Indizes zu Definieren,
die sich aus mehreren anderen DB Spalten zusammensetzen.

Zur Zeit habe Spalte a und b und hätte gerne einen Index c der mit a*b definiert ist.

Geht das mit MYSQL überhaupt, und wenn ja wie?

Meine bisherige Abfrage schaut ca so aus, aber bevor ich das so
stehen lasse, wollt ich wissen wie man das Professionell löst.
PHP-Code:
//derzeit
SELECT a*AS ab FROM `a_testORDER BY a*b;
//meine Vorstellung
SELECT c AS ab FROM `a_testORDER BY c
Ich hab zwar nach allem möglichen gesucht aber irgendwie nichts gefunden.

Würde mich über eure Lösungen freuen

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

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

Alt 28.01.2010, 21:36  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.627
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Code:
SELECT a*b AS c FROM `a_test` ORDER BY c;
So? Durch das AS wird a*b zur "Spalte" c womit du auch danach Sortieren kannst.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 28.01.2010, 21:46  
Neuer Benutzer
 
Registriert seit: 28.01.2010
Beiträge: 5
PHP-Kenntnisse:
Anfänger
Flot befindet sich auf einem aufstrebenden Ast
Standard

Naja nein ich will die Logik extern definiert haben.
Und nicht 10 mal selber definieren müssen.

Außerdem würde das ja keinen Performance Vorteil bringen, da ja alles
durchgerechnet wird.

mgf
Flot ist offline   Mit Zitat antworten
Alt 28.01.2010, 21:46  
thomas_w
Gast
 
Beiträge: n/a
Standard

Soweit ich es verstanden habe ist c ein Rechenergebnis der Spalten "a" mal "b" und nach diesem Rechenergebnis soll nun ein Index zur schnelleren Sortierung aufgebaut werden.

C ist quasi eine redundante Spalte von "a" * "b"

Code:
CREATE TABLE test_a (
 a INT NOT NULL,
 b INT NOT NULL,
 c INT NOT NULL
);

CREATE INDEX sx_test_a_01 ON test_a (c);

INSERT INTO test_a VALUES
( 10, 20, 10*20 );
 
SELECT c AS ab FROM `a_test` ORDER BY c;
Soweit mal meine Ideen dazu..

Grüße
Thomas
  Mit Zitat antworten
Alt 28.01.2010, 21:53  
Neuer Benutzer
 
Registriert seit: 28.01.2010
Beiträge: 5
PHP-Kenntnisse:
Anfänger
Flot befindet sich auf einem aufstrebenden Ast
Standard

Ja genau.
Nur will ich mich nicht selbst darum kümmern

Außerdem müsste ich bei deiner Variante bei jedem update später daran denken auch den Spiegel zu erhöhen.
Flot ist offline   Mit Zitat antworten
Alt 28.01.2010, 21:57  
stebi
Gast
 
Beiträge: n/a
Standard

Das kannst du mit einem INSERT- / UPDATE-Trigger realisieren.

MySQL :: MySQL 5.1 Referenzhandbuch :: 20.1 CREATE TRIGGER
  Mit Zitat antworten
Alt 28.01.2010, 21:58  
thomas_w
Gast
 
Beiträge: n/a
Standard

Na dann schau Dir mal das Thema TRIGGER an.

Damit ist es möglich solche Berechnung zu automatisieren. MySQL führt diese Trigger dann automatisch bei jedem INSERT oder UPDATE aus.

Sinngemäß so

.. ON INSERT..

C = a * B

.. ON UPDATE

C = a * B

EDIT:

@stebi war schneller

Grüße
Thomas
  Mit Zitat antworten
Alt 28.01.2010, 23:20  
Neuer Benutzer
 
Registriert seit: 28.01.2010
Beiträge: 5
PHP-Kenntnisse:
Anfänger
Flot befindet sich auf einem aufstrebenden Ast
Standard

Danke
ist eigentlich genau das was ich gesucht hab, nur kann ich nicht die selbe Tabelle updaten.

Derzeitiger Aufbau schaut so aus.
PHP-Code:
CREATE TABLE IF NOT EXISTS `a_test` (
  `
idint(11NOT NULL auto_increment,
  `
aint(11NOT NULL,
  `
bint(11NOT NULL,
  `
cint(11NOT NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=;

INSERT INTO `a_test` (`id`, `a`, `b`, `c`) VALUES
(1110),
(
2110),
(
3110);

DROP TRIGGER IF EXISTS `trigger_name`;
DELIMITER //
CREATE TRIGGER `trigger_nameAFTER INSERT ON `a_test`
 FOR 
EACH ROW UPDATE a_test SET c b
//
DELIMITER 
Nur kommt dann die Fehlermeldung:
#1442 - Can't update table 'a_test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Soweit ich das jetzt verstanden hab kann man nicht die selbe Tabelle updaten, damit es nicht zur Rekursionen kommt.

Gibt es noch andere Ansätze oder muss ich einfach was ändern

mfg
Flot ist offline   Mit Zitat antworten
Alt 29.01.2010, 00:27  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

CREATE TRIGGER `trigger_name` AFTER INSERT ON `a_test` FOR EACH ROW SET NEW.c = a + b
Müsste AFAIK so gehen, wichtig ist das "NEW." for dem "c".
Siehe Dokumentation, gaaaaanz weit unten.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 29.01.2010, 07:36  
thomas_w
Gast
 
Beiträge: n/a
Standard

Innerhalb dem Trigger brauchst Du keinen erneuten INSERT auf die Tabelle test_a, denn der Trigger wurde ja von Deinem INSERT bereits ausgelöst. Der Trigger reagiert quasi auf den INSERT-Event. Der komplette Datensatz dieses INSERT ist in dem NEW Konstrukt vorhanden.

Siehe auch die Antwort von @G.Schuster

Also in etwa so (habe hier leider keine MySQL zu ausprobieren):

Code:
mysql> DELIMITER $$
mysql> CREATE TRIGGER test_a_bi_trigger
        BEFORE INSERT ON test_a
        FOR EACH ROW
        BEGIN
         SET NEW.c = NEW.a * NEW.b;
        END$$
        
mysql> CREATE TRIGGER test_a_bu_trigger
        BEFORE UPDATE ON test_a
        FOR EACH ROW
        BEGIN
         SET NEW.c = NEW.a * NEW.b;
        END$$        
mysql> DELIMITER ;
Damit werden zwei Trigger erzeugt. Before INSERT und Before UPDATE.

Grüße
Thomas

Geändert von thomas_w (29.01.2010 um 07:44 Uhr).
  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
[Erledigt] MYSQL INDEX Frage 700.000 Datensätze ? c01001 Datenbanken 2 20.04.2009 13:55
php datei löschen djscaleo PHP Tipps 2008 21 14.11.2008 15:47
Undefined variable Undefined property: block xxJJxx PHP Tipps 2008 16 05.08.2008 15:30
Notice: Undefined index Kein Genie PHP Tipps 2008 5 23.04.2008 17:40
Prototype Ajax Array Datenmüll notyyy HTML, Usability und Barrierefreiheit 2 08.04.2008 10:57
Array index updaten obi PHP Tipps 2008 4 28.11.2007 15:08
Index über 2 Spalten, unique mAy^daY Datenbanken 5 09.08.2007 16:02
Index vom Array zurücksetzen kampfnickel PHP Tipps 2007 6 08.01.2007 17:24
ftp account erstellen in confixx umgebung PHP-Fortgeschrittene 5 15.02.2006 20:41
Undefined index PHP Tipps 2005-2 1 07.08.2005 17:10
mysql_num_row unde Index bleibt trotzdem 0 in der DB nieselfriem PHP Tipps 2005-2 7 30.07.2005 17:30
2 verschachtelte while Schleifen. Großes Performanceproblem Datenbanken 3 30.05.2005 12:52
Undefined index PHP Tipps 2005 5 05.02.2005 14:57
[Erledigt] Elementare Frage: Schneller durch Index? - Bin ratlos! Datenbanken 1 16.12.2004 05:23
Undefined index: PHP Tipps 2004 6 15.09.2004 12:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mqsl, mysql trigger 2 spalten ändern, mysql trigger #1442, can\'t update table in stored function/trigger because it is already used by statement, mysql trigger before update gleiche tabelle, #1442 - can\'t update table \'user\' in, index trigger berechnen mysql, mysql update trigger selbe tabelle, can\'t update table because it is already used by statement which invoced this stored, notice undefined index: nach update lösung, mysql create index trigger, mysql index über zwei spalten

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:39 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