Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

ORDER BY Color dengan Kode Hex sebagai kriteria di MySQL

Anda ingin mengurutkan kode hex berdasarkan panjang gelombang, ini secara kasar memetakan ke nilai rona. Diberikan kode hex sebagai string enam karakter:RRGGBB .

Anda hanya perlu membuat fungsi yang mengambil string hexcode dan mengeluarkan nilai hue, berikut rumusnya dari jawaban Math.SO ini :

R' =R/255

G' =G/255

B' =B/255

Cmaks =maks(R', G', B')

Cmin =min(R', G', B')

=Cmax - Cmin

Saya ingin melihat apakah ini akan berhasil, jadi saya membuat contoh program di Ruby, mengambil sampel 200 warna acak secara seragam dari ruang RGB, dan mengurutkannya, hasilnya terlihat seperti pelangi!

Ini sumber Ruby:

require 'paint'

def hex_to_rgb(hex)
  /(?<r>..)(?<g>..)(?<b>..)/ =~ hex
  [r,g,b].map {|cs| cs.to_i(16) }
end

def rgb_to_hue(r,g,b)
  # normalize r, g and b
  r_ = r / 255.0
  g_ = g / 255.0
  b_ = b / 255.0

  c_min = [r_,g_,b_].min
  c_max = [r_,g_,b_].max

  delta = (c_max - c_min).to_f

  # compute hue
  hue = 60 * ((g_ - b_)/delta % 6) if c_max == r_
  hue = 60 * ((b_ - r_)/delta + 2) if c_max == g_
  hue = 60 * ((r_ - g_)/delta + 4) if c_max == b_

  return hue
end

# sample uniformly at random from RGB space
colors = 200.times.map {  (0..255).to_a.sample(3).map { |i| i.to_s(16).rjust(2, '0')}.join   }

# sort by hue
colors.sort_by { |color| rgb_to_hue(*hex_to_rgb(color)) }.each do |color|
  puts Paint[color, color]
end

Catatan, pastikan untuk gem install paint untuk mendapatkan output teks berwarna.

Berikut outputnya:

Seharusnya relatif mudah untuk menulis ini sebagai fungsi yang ditentukan pengguna SQL dan ORDER BY RGB_to_HUE(hex_color_code), namun, pengetahuan SQL saya cukup mendasar.

EDIT:Saya memposting pertanyaan ini di dba.SE tentang mengonversi Ruby ke fungsi yang ditentukan pengguna SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. URL Tulis ulang basis data kueri?

  2. Apakah addlashes() cukup aman untuk menghindari SQL INJECTIONS?

  3. PILIH bidang MySQL yang berisi substring

  4. Saat menggunakan ini_set('max_execution_time', 0);

  5. Cara memulai, memulai ulang, memeriksa status, dan menghentikan server MySQL