2011-06-29 47 views
2

收到隨機組合,這是原來的問題:有一點麻煩的MySQL查詢到從3個表

好吧,這裏是我的問題,我有兩個 表,一個名爲firstnames和 其他命名爲姓氏。我在此嘗試的 是從這些 名稱中找到100個 用於測試數據的可能組合。第一個名稱爲 的表在單個 列中有5494個條目,並且在單列中的姓氏表具有 88799個條目。我已經能夠 的 只查詢拿出有一定的效果是:

SELECT * FROM 
    (SELECT * FROM firstnames ORDER BY rand()) f 
    LEFT JOIN 
     (SELECT * FROM lastnames 
ORDER BY rand()) l ON 1=1 limit 10; The problem with this code is 

它選擇1個名字並給出 每一個名字,可以用它去。 雖然這是合理的,我會 設定的上限,以5億在 爲了得到所有組合 可能,而不必僅20第一 名(和我寧願不殺我 服務器)。但是,我只需要100 隨機世代的條目爲 測試數據,而我將無法通過 獲得該代碼。任何人都可以 請給我任何建議?

  • 以上問題已經回答,我需要關於下面問題的建議。我只是提供它作爲背景。

我想加入另一個表到混合命名狀態。這個表在一列中有5個條目,每當我嘗試將它連接到另外兩個表時,它就結束了重複其他兩個表,以便狀態標籤符合其中的每一個。那我越來越溫和的成功,唯一的一個是這樣的:

SELECT * 
FROM (SELECT firstnames FROM firstnames ORDER BY RAND() LIMIT 5) AS First 
JOIN (SELECT lastnames FROM lastnames ORDER BY RAND() LIMIT 5) as Last 
JOIN (SELECT status FROM status ORDER BY RAND() LIMIT 1) AS Status ON 1=1; 

雖然姓和名不要在此查詢重複,只有一個身份標籤,列出他們每個人。非常感謝你們的幫助!

+0

執行表有一個'id'場(主鍵)? –

+0

不,他們沒有。我原本確實在每張桌子上放了他們,但它造成了一團糟。 – Michael

+0

相關問題:http://stackoverflow.com/questions/6506709/mysql-query-to-receive-random-combinations-from-two-tables –

回答

2

使用MySQL變量,你應該能夠通過像完成......雖然沒有明確測試,這應該讓你你想。你不能做一個簡單的笛卡爾交叉連接,因爲你知道它會得到第一個名字,並加入所有姓氏,然後是所有姓氏的NEXT名字...

此查詢使用MySQL變量。內部查詢(預先分別名和姓)將預先查詢您的隨機10個第一個(或最後一個)名稱。然後,將它加入名字序列(@fns)和姓氏序列(@lns)的@variable。由於兩者都只有10條記錄,並且每條記錄都以它們的計數器爲0開始,所以它們都將導致記錄序列從1-10開始,因此JOIN將位於SEQUENCE中,其中每個保證值中只有一個會發生... vs rand()它返回一些浮點數部分,你永遠不能保證一個表中的數字與另一個表中的數字匹配。

select 
     First10.FirstName, 
     Last10.LastName, 
     (SELECT status FROM status ORDER BY RAND() LIMIT 1) AS Status 
    from 
     (select fn.FirstName, 
       @fns := @fns + 1 as Sequence 
      from 
      (select FirsName, 
        from FirstNames 
        order by rand() 
        limit 10) fn, 
      (select @fns := 0) vars 
    ) First10 

     JOIN 

     (select ln.LastName, 
       @lns := @lns + 1 as Sequence 
      from 
       (select LastName, 
        from LastNames 
        order by rand() 
        limit 10) ln, 
       (select @lns := 0) vars 
    ) Last10 

     ON First10.Sequence = Last10.Sequence 
+0

+1非常好。 –

+0

這對於我上一個問題需要的原始查詢來說要好得多。非常感謝你! 但是,現在我需要將狀態表添加到組合中。 – Michael

+0

@ypercube,謝謝...我發現MySQL變量可以很方便地用於許多解決方案......並已用於S/O提供的各種COMPLEX解決方案。 – DRapp

0

我會先在兩個表上添加(自動編號)ID字段。

然後,我會寫的存儲過程:

  • 創建的臨時表randomid用2個字段(firstid,lastid)。

  • 在兩個字段中插入100行(或需要的數字)和隨機整數(從1到MAX(firstnames.id)到第一個字段並從1到MAX(lastnames.id)到第二個一)。

  • 加入firstnameslastnames表來randomid

  • 丟棄臨時表。

+0

臨時表???請... – Bohemian

+0

我已經有一個解決方案來生成隨機名稱,但我需要將狀態表加入其他兩個。 – Michael

0

如何將它打開它的頭:

SELECT f.name,l.name FROM lastnames l INNER JOIN firstnames f ON 1=1 ORDER BY rand() limit 100; 

內部連接比左聯接等快?

+0

查詢從來沒有回來,我已經有了這個問題的一部分的解決方案。我試圖將狀態表加入其他兩個。 – Michael

+0

添加狀態此查詢會比使用子簡單選擇 –

+0

雖然表現就不會那麼好,我不認爲 –

0

我不知道你的狀態表做了什麼,但是這將讓你隨機的名字:

select firstnames, lastnames 
from (select firstnames from firstnames order by rand() limit 100) fn 
cross join (select lastnames from lastnames order by rand() limit 100) ln 
order by rand() 
limit 100; 

的別名選擇有那麼在這一輩子的查詢返回 - 有10000行的交叉連接...可管理。沒有他們,就不會有排gazillions - 查詢不會回來跟你的行數

+0

狀態表旨在通過標記隨機標記隨機名稱。例如。活着,死亡等等。總共有5行。 – Michael

0

這應該解決的問題狀態:

SELECT 
    First.firstnames firstname 
    Last.lastnames lastname 
    (SELECT status FROM status ORDER BY RAND() LIMIT 1) status 
FROM 
    (SELECT firstnames FROM firstnames ORDER BY RAND() LIMIT 5) First 
    JOIN (SELECT lastnames FROM lastnames ORDER BY RAND() LIMIT 5) Last