2009-10-21 15 views
9

मैं कुछ विरासत कोड/डेटाबेस पर काम कर रहा हूं, और डेटाबेस में एक फ़ील्ड जोड़ने की आवश्यकता है जो उस (विदेशी) आईडी से संबंधित अनुक्रम संख्या रिकॉर्ड करेगा।MySQL: किसी अन्य फ़ील्ड के आधार पर अनुक्रम कॉलम जोड़ें

उदाहरण तालिका डेटा (वर्तमान):

ID  ACCOUNT  SEQ  some_other_stuff 
1  1   1  ... 
2  1   2  ... 
3  1   3  ... 
4  2   1  ... 
5  2   2  ... 
6  1   4  ... 

ध्यान दें कि अनुक्रम खाते से संबंधित है:

ID  ACCOUNT  some_other_stuff 
1  1   ... 
2  1   ... 
3  1   ... 
4  2   ... 
5  2   ... 
6  1   ... 

मैं एक sequenceid स्तंभ जो प्रत्येक खाते के लिए अलग से वृद्धि कर देता है, को प्राप्त करने जोड़ने की जरूरत है।

क्या एसक्यूएल में मैं इसे प्राप्त कर सकता हूं, या क्या मैं अपने लिए नौकरी करने के लिए एक PHP स्क्रिप्ट का सहारा लेता हूं?

TIA, कीव

उत्तर

6

यह काम करना चाहिए लेकिन शायद धीमा है:

CREATE temporary table seq (id int, seq int); 
INSERT INTO seq (id, seq) 
    SELECT id, 
     (SELECT count(*) + 1 FROM test c 
     WHERE c.id < test.id AND c.account = test.account) as seq 
    FROM test; 

UPDATE test INNER join seq ON test.id = seq.id SET test.seq = seq.seq; 

मैंने टेबल 'टेस्ट' कहा है; जाहिर है कि सही ढंग से सेट करने की जरूरत है। आपको एक अस्थायी तालिका का उपयोग करना होगा क्योंकि MySQL आपको उसी तालिका से उप-चयन का उपयोग नहीं करने देगा जो आप अपडेट कर रहे हैं।

+0

@tom haigh can आप कृपया बताएं कि यह कैसे काम करता है? – FBP

4

सवाल "mysql", तो हाँ, MySQL के auto_increment ग्रुपवाइज अनुक्रमिक आईडी बना सकते हैं के रूप में चिह्नित किया गया है।
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html देखें:

लिए MyISAM और BDB टेबल आप एक बहु-स्तंभ सूचकांक में एक माध्यमिक स्तंभ पर AUTO_INCREMENT निर्दिष्ट कर सकते हैं। इस मामले में, AUTO_INCREMENT कॉलम के लिए जेनरेट किया गया मान MAX(auto_increment_column) + 1 WHERE prefix=given-prefix के रूप में गणना की जाती है। यह तब उपयोगी होता है जब आप डेटा को क्रमबद्ध समूहों में रखना चाहते हैं।

संपादित करें: उदाहरण के PHP स्क्रिप्ट (PDO का उपयोग कर, लेकिन यह एक ही php-mysql मॉड्यूल के साथ खेल है)

$pdo = new PDO('mysql:host=...;dbname=...', '...', '...'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// example table 
$pdo->exec(
    'CREATE TEMPORARY TABLE Foo (
    id int auto_increment, 
    account int, 
    someotherstuff varchar(32), 
    primary key(account,id) 
) engine=MyIsam' 
); 
// insert example data 
$stmt = $pdo->prepare('INSERT INTO Foo (account,someotherstuff) VALUES (?,?)'); 
$stmt->execute(array(1, '1a')); 
$stmt->execute(array(1, '1b')); 
$stmt->execute(array(1, '1c')); 
$stmt->execute(array(2, '2a')); 
$stmt->execute(array(2, '2b')); 
$stmt->execute(array(1, '1d')); 
unset($stmt); 

// query data 
foreach($pdo->query('SELECT account,id,someotherstuff FROM Foo') as $row) { 
    echo $row['account'], ' ', $row['id'], ' ', $row['someotherstuff'], "\n"; 
} 

प्रिंट

1 1 1a 
1 2 1b 
1 3 1c 
2 1 2a 
2 2 2b 
1 4 1d 
+0

प्रतिक्रिया के लिए धन्यवाद। क्षमा करें - मुझे निर्दिष्ट टेबल होना चाहिए innoDB। मैं अंततः नीचे temp टेबल समाधान के लिए चला गया, लेकिन इनपुट की सराहना करते हैं! चीयर्स! –

+0

अच्छा समाधान। यह सही जवाब है। बहुत अच्छा काम करता है। – SuB

5

एक ट्रिगर बनाएं:

CREATE TRIGGER trg_mytable_bi 
BEFORE INSERT ON mytable 
FOR EACH ROW 
BEGIN 
     DECLARE nseq INT; 
     SELECT COALESCE(MAX(seq), 0) + 1 
     INTO nseq 
     FROM mytable 
     WHERE account = NEW.account; 
     SET NEW.seq = nseq; 
END; 
+0

ओपी मानते हुए MySQL 5 है ... – Ben

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन अंत में मैं उपरोक्त अस्थायी तालिका समाधान के लिए गया। –

+0

किसी को भी भ्रमित त्रुटियों के साथ समस्या होने के लिए, ट्रिगर में डिलीमीटर का उपयोग करने के बारे में यहां देखें: http://stackoverflow.com/questions/5814153/error-in-your-sql-syntax-creating-mysql-trigger – Druckles

संबंधित मुद्दे