2013-02-08 62 views
7

Giả sử tôi có các bảng sau:Truy vấn MySQL để cập nhật cột trong mysql dựa trên bảng?

tableA

a_name | age | country 
Jordan | 5 | Germany 
Jordan | 6 | Spain 
Molly | 6 | Spain 
Paris | 7 | France 
John | 7 | Saudi Arabia 
John | 5 | Saudi Arabia 
John | 6 | Spain 

TableB

id (auto increment primary key) 
    | age | country  | group_num (initially null) 
1 | 5 | Germany  | 
2 | 6 | Spain  | 
3 | 7 | France  | 
4 | 7 | Spain  | 
5 | 8 | France  | 
6 | 9 | France  | 
7 | 2 | Mexico  | 
8 | 7 | Saudi Arabia | 
9 | 5 | Saudi Arabia | 

Tôi muốn để có thể làm một số loại chọn/cập nhật nơi tôi có thể nhận được như sau giá trị cho cột "group_num":

tableB

id (auto increment primary key) 
    | age | country  | group_num 
1 | 5 | Germany  | 1 
2 | 6 | Spain  | 1 
3 | 7 | France  | 1 
4 | 7 | Spain  | 
5 | 7 | France  | 2 
6 | 9 | France  | 
7 | 2 | Mexico  | 
8 | 7 | Saudi Arabia | 1 
9 | 5 | Saudi Arabia | 1 

group_num được gán dựa trên các tiêu chí về:

1) Places person "a_name" went. 
2) Whether other people visited that same country. (regardless of age). 

Lý do tại sao tất cả các id của 1,2,3,8,9 có cùng groupId là vì Jordan, Molly, và Paris tất cả xảy ra với bằng cách nào đó được liên kết vì hai tiêu chí trên. (tất cả họ đều đi đến Tây Ban Nha) và các nước khác, tức là Đức đã được viếng thăm bởi Jordan người cũng viếng thăm Tây Ban Nha, vì vậy nó có cùng group_num. Ảrập Xêút đã được viếng thăm bởi John, người cũng viếng thăm Tây Ban Nha, vì vậy nó có cùng một group_num.

là có một số truy vấn SQL hoặc truy vấn (có thể có hoặc không liên quan đến việc tạo ra bảng "bổ sung" khác để có được kết quả mong muốn hiển thị ở trên? (tức là nó không quan trọng nếu group_num nên đầu tiên được lấp đầy với các giá trị auto_incrementing giống như "id", sau đó được cập nhật sau này nếu cần thiết. (có thể có giá trị không null cho các trường giá trị khác hiện được hiển thị là "(trống)"

Con trỏ/lặp lại rất chậm ... Sau đây là các bước tôi sẽ thực hiện để điền vào các giá trị đó, quá trình rất chậm bằng cách sử dụng con trỏ, nếu tôi có thể loại bỏ điều này, nó sẽ tuyệt vời:

  1. Đối với tableA, chúng ta thấy rằng Jordan đến Đức lúc 5 tuổi. (Group_Num trong bảng B cho [5, Đức] được cập nhật thành 1).
  2. Jordan thăm Tây Ban Nha lúc 6 tuổi. (Nhóm Num cho [6, Tây Ban Nha] được cập nhật thành 1 để hiển thị cùng một nhóm với cùng tên mà anh ấy đã ghé thăm Tây Ban Nha)
  3. Molly thăm Tây Ban Nha lúc 6 tuổi (group_num cho [6 , Tây Ban Nha] được cập nhật thành 1 vì ngay cả khi một người khác, cùng một cặp tuổi/quốc gia bị trúng)
  4. Paris đã đến Pháp lúc 7 tuổi (group_num trong bảngB cập nhật thành 2 vì cô ấy là người khác, đã truy cập hoàn toàn khác
  5. John thăm Ả Rập Xê Út ở tuổi 7 (nhóm_num cho [7, Saudi Arabia] trong bảngB được cập nhật thành 3 tuổi + cặp quốc gia)
  6. John thăm Ả Rập Xê Út ở tuổi 5 (group_num cho [5, Saudi Arabia] trong bảngB được cập nhật thành 3 cho độ tuổi + quốc gia kể từ khi nó vẫn là John)
  7. John thăm Tây Ban Nha lúc 6 tuổi (group_num cho [6, Tây Ban Nha] đã 1 .. Jordan đã truy cập ở đó trước , có thể có một số nhóm ... do đó group_num cho tất cả các địa điểm mà John đã ghé thăm [6, Tây Ban Nha], [5, Ả Rập Saudi] và [7, Ả Rập Saudi] đều được cập nhật thành 1
+4

[Bạn đã thử gì?] (Http://www.whathaveyoutried.com/) Xem [hỏi lời khuyên] (http://stackoverflow.com/questions/ask-advice). –

+0

Lập trình bằng cách sử dụng các con trỏ SQL để lặp qua từng hàng của bảng A và cập nhật bảng B khi cần thiết. Tìm cách tốt hơn để làm điều này nếu có thể với các truy vấn SQL. – Rolando

+1

Thật không may là những người trong ví dụ có tên như Jordan (một quốc gia) và Paris (một thành phố nổi tiếng ở một quốc gia khác) – Magnus

Trả lời

1

Bạn sẽ cần một cách tiếp cận lặp đi lặp lại mà sẽ dựa trên từng hạng mục mới được thêm vào Table1, nếu bạn thực hiện những điều khoản sau đây cho từng hạng mục như vậy nó sẽ được nhanh chóng và hiệu quả:

Đây là SQLFiddle cho trạng thái của db ngay trước khi chèn bản ghi cuối cùng trong Bảng 1.

BTW: Ví dụ của bạn không hoàn toàn phù hợp với mô tả của bạn, tôi cho rằng bạn đã ký Pháp 7 là nhóm 1 do nhầm lẫn, vì Paris không liên quan đến ai trong nhóm 1 .

Lưu ý các lựa chọn mà tôi đang thực hiện:

  1. Người đầu tiên tìm kiếm số nhóm của những địa điểm trước đây tôi đã ghé thăm (đây là nhóm phân tách của tôi, ví dụ: nhóm num 3).
  2. Thứ hai là tìm kiếm nếu có một nhóm rời nhau rằng hồ sơ chèn có thể liên quan đến, bằng cách tìm kiếm nhóm num cho spain và tuổi 6.

Sau khi tìm ra rằng bạn có hai bộ rời nhau mà trở nên tham gia là kết quả của kỷ lục mới được chèn vào, bạn có thể rằng CẬP NHẬT tất cả các num nhóm trước đây giao như số lượng nhóm thứ hai để là người đầu tiên, theo cách như vậy:

UPDATE Table2 set group_num = 1 where group_num = 3

vì vậy, tôi đã không sử dụng bất kỳ con trỏ, nhưng bản cập nhật này là mỗi lần chèn cho Bảng 1.

0

@ Damascusi bạn có thể thấy nếu tiggers có thể làm việc thay vì con trỏ. Trình kích hoạt nhanh hơn con trỏ nếu chỉ bạn có thể cập nhật group_num khi đang di chuyển và khi dữ liệu được chèn vào Bảng A.

Các vấn đề liên quan